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

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

相关推荐
Zhang~Ling8 小时前
Redis 基础教程:从常用命令到实际业务场景
数据库·redis·缓存
程序员清风10 小时前
缓存、索引与数据结构的工程选择
数据结构·spring·缓存
code2cat11 小时前
【随笔】RAG语义缓存:问题很相似,答案就能直接复用吗
java·缓存·知识库·rag
小静AI工程实验室12 小时前
AI 应用缓存键怎么设计?租户、模型、提示词与索引版本的 7 项离线验证
缓存
北京地铁1号线12 小时前
后端开发:缓存(Cache)简介
后端·缓存·cache
李纲明13 小时前
WordPress 结账页一直转圈不跳支付:AJAX、缓存排除、支付回调和 REST 怎么逐层核
运维·ajax·缓存·wordpress·woocommerce·devdiy·结账
程序猿编码1 天前
纯 C++ 手写 LLM 推理引擎:分页 KV 缓存、连续批、多卡张量并行全部内置
c++·深度学习·缓存·大模型推理·自动微分·模型推理
code2cat1 天前
【随笔】RAG检索缓存:复用证据之前,先把权限和版本放进缓存键
java·人工智能·缓存·知识库·rag
牧瀬クリスだ1 天前
Redis五大数据类型全解析:从入门到实战
java·数据库·redis·后端·缓存
讯捷蓝达1 天前
HPE Nimble CS3000存储,断电恢复后,双控缓存异常,存储卷无法正常启动
缓存