Redis 缓存问题(一致性、穿透、击穿和雪崩)
简介:缓存机制能避免请求过多的直接与数据库操作,从而造成系统瓶颈,极大的提升了用户体验和系统稳定性。虽然给系统带来了一定质的提升,但是也带来一些问题。
1. 缓存一致性
A. 定义:当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异的现象。
2. 缓存穿透
A. 定义:在高并发场景下,如果某一个key被高并发访问,没有被命中缓存,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致大量的请求达到数据库,而当key对应的数据本身就是空的情况下,这就导致数据库中并发的执行了很多不必要的查询操作,从而导致巨大冲击和压力,针对并发查同一条缓存和数据库中都没有的数据;
B. 解决方案
缓存空对象:如果是集合就缓存一个空集合,而非null,如果是对象就用字段标识来区分,但是失效时间应设置短一些;
过滤:接口层增加校验;
布隆过滤器(BloomFilter);
C. BloomFilter实例
3. 缓存击穿
A. 定义:是指缓存中没有数据,但是数据库是有数据的,例如缓存key到期,这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力,针对并发查同一条过期数据;
B. 解决方案:设置热点数据永不过期;服务限流、熔断或降级;加互斥锁;
C. 分布式锁示例
4. 缓存雪崩
A. 定义:指由于缓存的原因,如缓存服务器故障、key失效时间相同等,导致大量请求达到后端数据库,从而导致数据库崩溃,进而引发系统崩溃,针对并发查多条同时过期的数据;
B. 解决方案
若因key失效时间相同,就让key失效时间错开;
若因缓存服务器故障,建立分布式高可用的缓存系统,即缓存预备。
5. 缓存预热
A. 定义:指系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题;
B. 解决方案:代码+人工实现;定时刷新缓存。
可参考:Redis缓存问题及解决方案
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗