redis学习--缓存雪崩缓存击穿和缓存穿透(代码片段)

猎人在吃肉 猎人在吃肉     2023-03-03     766

关键词:

文章目录

1、缓存处理流程

前台请求,
先从 缓存中 取数据,
如果 取到,则直接返回结果,
如果 取不到时,去数据库中查询,数据库取到后,更新缓存,并返回结果; 如果数据库也没取到,那直接返回空结果。

2、缓存穿透

2.1、描述

缓存穿透 是指查询一个一定不存在的数据,由于在缓存不存在,需要到数据库查询,数据库中也查不到,所以无法写入缓存,这样每次请求这个不存在的数据时都要到数据库去查询,从而可能压垮数据源。

在缓存和数据库中都没有的数据,而用户不断发起请求,如发起为 id为“-1” 的数据或 id为特别大且不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

特点:

  • 要查询的数据根本(如 id=-1) 就不存在;
  • 缓存和数据库中也不存;
  • 不停地查询数据库,可能压跨数据库。

2.2、解决办法

  • 对空值缓存:
    通常对缓存中不存在的、数据库中也不存在的数据不进行缓存,但是这也导致了每次都要查询数据库,给数据库造成巨大的压力。
    如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟。这样在缓存阶段进行拦截,减少应用程序和数据库的压力。
    举个例子,比如 id=28888 在缓存和数据库中不存在,第一次数据库查询后也要进行缓存,后面多次请求这个数据时,可以直接跳转到空页等,避免再次查询数据库,减小应用程序压力。

  • 设置可访问的名单(白名单)
    使用 bitmaps 类型定义一个 可以访问的名单 ,名单 id 作为 bitmaps 的偏移量。每次访问 id 和 bitmap 里面的id进行比较,如果访问 id 不在 bitmaps 里面,进行拦截,不允许访问。

  • 采用布隆过滤器(Bloom Filter):
    布隆过滤器 是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(即Hash哈希函数)。
    布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是 空间效率和查询时间都远远超过一般的算法,缺点是 有一定的误识别率和删除困难。
    将所有可能存在的数据哈希到一个足够大的 bitmaps 中,一个一定不存在的数据会被 这个 bitmaps 拦截掉,从而避免了对底层存储系统的查询压力。
    布隆过滤器 底层与 bitmaps 一样,只是对 bitmaps 过程进行了优化。

  • 进行实时监控:
    当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。

3、缓存击穿

3.1、描述:

缓存击穿是指某一个key, 缓存中没有(可能是缓存到期,失效了),数据库中有的数据,这时大量访问中,都使用这个key,缓存没此数据,就是数据库中查询,引起数据库压力瞬间增大,造成过大压力。

特点:

  • 针对一个key,在缓存中没有(可能是缓存到期,失效了);
  • 数据库中有的数据;
  • 针对这一个key,大量请求去查询数据库(实际上只查询一次,放到缓存里即可)。

3.2、 解决方案:

  • 预先设置热门数据: 在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长

  • 调整过期时间: 现场监控哪些数据热门,实时调整key的过期时长

  • 加互斥锁,互斥锁参考代码如下:

    代码运行说明:

    1)缓存中有数据,直接走上述代码13行后就返回结果了
    
    2)缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,
    其他并行进入的线程会等待100ms,再重新去缓存取数据。
    这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。
    
    3)当然这是简化处理,理论上如果能根据key值加锁就更好了,
    就是线程A从数据库取key1的数据并不妨碍线程B取key2的数据,上面代码明显做不到这点。
    

4、缓存雪崩(缓存数据集体失效)

4.1、 描述

大量的缓存数据 集中失效,此时有大量并发请求过来,这些请求发现缓存过期,程序都会从数据库 加载数据,更新缓存,并返回结果,如果大量请求可能会瞬间把 数据库压垮

特点:

  • 大量缓存集中失效;
  • 大量查询数据库,可能压跨数据库。

4.2、缓存击穿和缓存雪崩 的区别:

缓存击穿:并发地查询同一条数据;
缓存雪崩:不同数据都过期了,很多数据都查不到从而查数据库。

4.3、解决方案

缓存失效时的雪崩效应对底层系统的冲击非常可怕!

解决方案

  1. 缓存失效时间分散开,防止同一时间大量数据过期。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  3. 设置热点数据永远不过期。

5、参考来源:

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

redis12_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis12_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis08_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis之缓存穿透击穿雪崩问题与缓存删除淘汰策略(代码片段)

一、缓存问题与解决缓存穿透缓存穿透是指查询缓存和DB中都不存在的数据。缓存穿透示例:publicStationfindProjectStation(LongstationId)//从缓存中查询Stationstation=(Station)redisTemplate.boundHashOps("project_station").get(stationId);if(station==null)// 查看详情

redis之缓存穿透击穿雪崩问题与缓存删除淘汰策略(代码片段)

一、缓存问题与解决缓存穿透缓存穿透是指查询缓存和DB中都不存在的数据。缓存穿透示例:publicStationfindProjectStation(LongstationId)//从缓存中查询Stationstation=(Station)redisTemplate.boundHashOps("project_station").get(stationId);if(station==null)// 查看详情

redis的缓存穿透缓存雪崩缓存击穿问题的概念与解决办法(代码片段)

详细介绍了Redis的缓存穿透、缓存雪崩、缓存击穿等问题的概念与解决办法。文章目录1缓存穿透1.1什么是缓存穿透?1.2怎么解决1.3BloomFilter布隆过滤器1.3.1BloomFilter的原理1.3.2BloomFilter的优缺点1.3.3GuavaBloomFilter1.3.4RedisBloomFilter2... 查看详情

redis——缓存穿透缓存击穿缓存雪崩分布式锁(代码片段)

文章目录:1.缓存穿透1.1什么是缓存穿透?1.2缓存穿透的解决方案2.缓存击穿2.1什么是缓存击穿?2.2缓存击穿的解决方啊3.缓存雪崩3.1什么是缓存雪崩?3.2缓存雪崩的解决方案4.分布式锁4.1使用setnx+del实现分布式... 查看详情

redis——缓存穿透缓存击穿缓存雪崩分布式锁(代码片段)

文章目录:1.缓存穿透1.1什么是缓存穿透?1.2缓存穿透的解决方案2.缓存击穿2.1什么是缓存击穿?2.2缓存击穿的解决方啊3.缓存雪崩3.1什么是缓存雪崩?3.2缓存雪崩的解决方案4.分布式锁4.1使用setnx+del实现分布式... 查看详情

redis的缓存问题之缓存穿透缓存雪崩缓存击穿(代码片段)

目录一、什么是缓存穿透?二、常见的解决方案有两种:1、缓存空对象2、布隆过滤综上所述三、编码解决商品查询的缓存穿透问题四、缓存雪崩问题及解决思路1、什么是缓存雪崩?五、缓存击穿问题及解决思路 1、... 查看详情

redis缓存雪崩缓存击穿缓存穿透原因,解决方案?(代码片段)

缓存雪崩、缓存击穿、缓存穿透原因,解决方案?缓存雪崩由于设置缓存时,key都采用了相同expire,导致缓存在某刻同时失效,请求全部直到DB,DB瞬时负载过重而雪崩解决方案在原有失效时间基础上增加一个随机值,比如1~5分钟... 查看详情

redis缓存雪崩缓存穿透缓存击穿

Redis缓存雪崩、缓存穿透、缓存击穿Redis缓存过程缓存雪崩解决方案永不过期合理的设置过期时间使用Redis的分布式锁缓存穿透解决方案过滤非法查询缓存空对象布隆过滤器布隆过滤器的新增布隆过滤器的查询布隆过滤器的删除布... 查看详情

redis学习--缓存雪崩缓存击穿和缓存穿透(代码片段)

文章目录1、缓存处理流程2、缓存穿透2.1、描述2.2、解决办法3、缓存击穿3.1、描述:3.2、解决方案:4、缓存雪崩(缓存数据集体失效)4.1、描述4.2、缓存击穿和缓存雪崩的区别:4.3、解决方案5、参考来源࿱... 查看详情

redis缓存穿透击穿雪崩到底是个啥?7张图告诉你(代码片段)

目录一、缓存是什么?二、缓存的作用和成本1、缓存的作用:2、缓存的成本:三、缓存作用模型1、根据id查询数据缓存流程四、缓存更新策略1、内存淘汰2、超时剔除3、主动更新五、缓存穿透解决方法:六、缓... 查看详情

redis学习笔记26——缓存异常:如何解决缓存雪崩击穿穿透问题?

缓存雪崩缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般有两个原因导致:1、缓存中有大量数据同时过期解决方法... 查看详情

redis学习笔记26——缓存异常:如何解决缓存雪崩击穿穿透问题?

缓存雪崩缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般有两个原因导致:1、缓存中有大量数据同时过期解决方法... 查看详情

redis学习笔记10:redis缓存穿透和雪崩

        Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那... 查看详情

redis从入门到进阶第6讲:缓存雪崩击穿穿透场景与解决方案(代码片段)

...前言  本专栏开启,目的在于帮助大家更好的掌握学习Redis,同时也是为了记录我自己学习Redis的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁以及Redis持久化等。... 查看详情

redis学习笔记10:redis缓存穿透和雪崩

        Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那... 查看详情