|NO.Z.00048|——————————|^^ 重要 ^^|——|Hadoop&Redis.V01|——|Redis.v01|穿透雪崩击穿|
一、Redis经典问题解析:穿透雪崩击穿
### --- 缓存穿透
~~~ 一般的缓存系统都是按照key去缓存查询如果不存在对应的value就应该去后端系统查找(比如DB)。
~~~ 缓存穿透是指在高并发下查询key不存在的数据,会穿过缓存查询数据库。导致数据库压力过大而宕机
### --- 解决方案:
~~~ 对查询结果为空的情况也进行缓存缓存时间(ttl)设
~~~ 置短一点或者该key对应的数据insert之后清理缓存。
~~~ # 问题:缓存太多空值占用了更多的空间
~~~ 使用布隆过滤器。在缓存之前在加一层布隆过滤器,
~~~ 在查询的时候先去布隆过滤器查询 key 是否存在,如果不存在就直接返回,存在再查缓存和DB。

~~~ # 布隆过滤器(Bloom Filter)是1970年由布隆提出的。
~~~ 它实际上是一个很长的二进制向量和一系列随机hash映射函数。
~~~ # 布隆过滤器可以用于检索一个元素是否在一个集合中。
~~~ 它的优点是空间效率和查询时间都远远超过一般的算法。


~~~ # 布隆过滤器的原理是,
~~~ 当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个数组中的K个点,把它们置为1。
~~~ # 检索时,
~~~ 我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:
~~~ 如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。
~~~ 这就是布隆过滤器的基本思想。
~~~ 把字符串------>位 省空间 (1或0)
~~~ 不用循环------>比较位置 省时间
二、缓存雪崩
### --- 缓存雪崩
~~~ 当缓存服务器重启或者大量缓存集中在某一个时间段失效,
~~~ 这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
~~~ 突然间大量的key失效了或redis重启,大量访问数据库,数据库崩溃
### --- 解决方案:
~~~ key的失效期分散开 不同的key设置不同的有效期
~~~ 设置二级缓存(数据不一定一致)
~~~ 高可用(脏读)
三、缓存击穿
### --- 缓存击穿
~~~ # 对于一些设置了过期时间的key,
~~~ 如果这些key可能会在某些时间点被超高并发地访问,
~~~ 是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,
~~~ 这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
~~~ # 缓存在某个时间点过期的时候,
~~~ 恰好在这个时间点对这个Key有大量的并发请求过来,
~~~ 这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,
~~~ 这个时候大并发的请求可能会瞬间把后端DB压垮。
### --- 解决方案:
~~~ # 用分布式锁控制访问的线程
~~~ 使用redis的setnx互斥锁先进行判断,这样其他线程就处于等待状态,
~~~ 保证不会有大并发操作去操作数据库。
~~~ # 不设超时时间,volatile-lru 但会造成写一致问题
~~~ 当数据库数据发生更新时,缓存中的数据不会及时更新,
~~~ 这样会造成数据库中的数据与缓存中的数据的不一致,应用会从缓存中读取到脏数据。
~~~ 可采用延时双删策略处理,这个我们后面会详细讲到。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv012-redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」