缓存雪崩、缓存穿透,缓存击穿

Redis是一个完全开源免费的高性能非关系型(NOSQL)的key-value数据库。 Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据 设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键删除。Redis对过期键的策略+持久化 如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删光了。这就会导致在这段时 间内,这些缓存同时失效,全部请求到数据库中。

Redis中缓存的数据大面积同时失效,或者Redis宕机,从而会导致大量请求直接到数据库,压垮数据库 缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!

解决方法: 在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。 对于"Redis挂掉了,请求全部走数据库"这种情况,我们可以有以下的思路: 事发前:实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉这种情况发生。

事发中:万一Redis真的挂了,我们可以设置本地缓存+限流,尽量避免我们的 数据库被干掉(起码能保证我们的服务还是能正常工作的)

事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

缓存穿透? 缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到 数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义 请求的数据在缓存大量不命中,导致请求走数据,也可能压垮数据库,导致整个服务瘫痪!

如何解决缓存穿透 由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter)提前拦截,不合法就不让这个请求到数据库层! 当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从 缓存里边获取了。 这种情况我们一般会将空对象设置一个较短的过期时间。

缓存击穿 Redis中一个热点key在失效的同时,大量的请求过来,从而会全部到达数据库,压垮数据库。 这里要注意的是这是某一个热点key过期失效,和缓存雪崩是有区别的。比如淘宝双十一,对于某个特价热门的商品信息,缓存在Redis中,刚好0点,这个商品信息在Redis中过期查不到了,这时候大量的用户又同时正好访问这个商品,就会造成大量的请求同时到达数据库。

解决办法 设置热点数据"永不过期" 或者定时更新,加上互斥锁:上面的现象是多个线程同时去查询数据库的这条数据,我们 可以在第一个查询数据的请求上使用一个互斥锁来锁住它 其他的线程走到这一步拿不到锁就等着,等 一个线程查询到了数据,然后将数据放到redis缓存起来。 后面的线程进来发现已经有缓存了,就直接走缓存。

相关推荐
Kevinyu_6 小时前
Redisson
java·redis·缓存
代码老y7 小时前
Redis 生产实战 7×24:容量规划、性能调优、故障演练与成本治理 40 条军规
数据库·redis·缓存
许苑向上1 天前
分布式缓存击穿以及本地击穿解决方案
java·分布式·缓存
L_qingting2 天前
Redis 主从复制
数据库·redis·缓存
代码老y2 天前
在百亿流量面前,让“不存在”无处遁形——Redis 缓存穿透的极限攻防实录
数据库·redis·缓存
阿巴~阿巴~2 天前
深入解析:磁盘级文件与内存级(被打开)文件的本质区别与联系
linux·运维·服务器·数据库·缓存
Dajiaonew2 天前
Redis主从同步原理(全量复制、增量复制)
数据库·redis·缓存
秋恬意2 天前
redis红锁
数据库·redis·缓存
sniper_fandc2 天前
Redis原理之持久化
数据库·redis·缓存