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

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缓存起来。 后面的线程进来发现已经有缓存了,就直接走缓存。

相关推荐
流星白龙11 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
流星白龙14 小时前
【Redis】3.Redis安装与命令行客户端
数据库·redis·缓存
我不想名字重复20 小时前
redis缓存和数据库数据保持一致
数据库·redis·缓存
时空无限20 小时前
vllm 大模型启动缓存相关环境变量 export
linux·缓存·vllm
流星白龙1 天前
【Redis】6.计数其他命令
数据库·redis·缓存
正儿八经的少年1 天前
redis 的大 key 和热 key 详解
数据库·redis·缓存
X-⃢_⃢-X1 天前
十、Redis之布隆过滤器
数据库·redis·缓存
Database_Cool_1 天前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
流星白龙1 天前
【Redis】1.Redis特性
数据库·redis·缓存
chexus1 天前
21. 深入 Nginx HTTP 缓存源码:CDN功能
nginx·http·缓存