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

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

相关推荐
Flying pigs~~11 小时前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
许彰午12 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
凯瑟琳.奥古斯特17 小时前
Redis是什么及核心特性
前端·css·redis·缓存
手握风云-1 天前
Redis:不只是缓存那么简单(六)
redis·缓存
啥都会一点的老程,自在地镜强者1 天前
【Agent 缓存技术核心差异化】—商业软件壁垒之前缀缓存(二)Codex和Claude code方案比对篇+过度解读
缓存·ai编程
手握风云-1 天前
Redis:不只是缓存那么简单(五)
缓存
Rust研习社1 天前
Rust 高性能内存缓存 moka 完全指南
开发语言·后端·缓存·rust
快乐非自愿2 天前
Redis--SDS字符串与集合的底层实现原理
数据库·redis·缓存
白晨并不是很能熬夜2 天前
【RPC】第 4 篇:服务发现 — Zookeeper + 缓存容错
java·后端·程序人生·缓存·zookeeper·rpc·服务发现
手握风云-2 天前
Redis:不只是缓存那么简单(四)
redis·缓存