当前位置: 首页 > news >正文

缓存篇—缓存雪崩

什么是缓存雪崩

通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。

那么,当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。

缓存雪崩的原因

可以看到,发生缓存雪崩有两个原因:

  • 大量数据同时过期;
  • Redis 故障宕机;

不同的诱因,应对的策略也会不同。

大量数据同时过期

针对大量数据同时过期而引发的缓存雪崩问题,常见的应对方法有下面这几种:

  • 均匀设置过期时间;
  • 互斥锁;
  • 后台更新缓存;

1. 均匀设置过期时间

如果要给缓存数据设置过期时间,应该避免将大量的数据设置成同一个过期时间。我们可以在对缓存数据设置过期时间时,给这些数据的过期时间加上一个随机数,这样就保证数据不会在同一时间过期。

2. 互斥锁

当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到 Redis 里),当缓存构建完成后,再释放锁。未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。

实现互斥锁的时候,最好设置超时时间,不然第一个请求拿到了锁,然后这个请求发生了某种意外而一直阻塞,一直不释放锁,这时其他请求也一直拿不到锁,整个系统就会出现无响应的现象。

3. 后台更新缓存

业务线程不再负责更新缓存,缓存也不设置有效期,而是让缓存“永久有效”,并将更新缓存的工作交由后台线程定时更新

事实上,缓存数据不设置有效期,并不是意味着数据一直能在内存里,因为当系统内存紧张的时候,有些缓存数据会被“淘汰”,而在缓存被“淘汰”到下一次后台定时更新缓存的这段时间内,业务线程读取缓存失败就返回空值,业务的视角就以为是数据丢失了。

解决上面的问题的方式有两种。

第一种方式,后台线程不仅负责定时更新缓存,而且也负责频繁地检测缓存是否有效,检测到缓存失效了,原因可能是系统紧张而被淘汰的,于是就要马上从数据库读取数据,并更新到缓存。

这种方式的检测时间间隔不能太长,太长也导致用户获取的数据是一个空值而不是真正的数据,所以检测的间隔最好是毫秒级的,但是总归是有个间隔时间,用户体验一般。

第二种方式,在业务线程发现缓存数据失效后(缓存数据被淘汰),通过消息队列发送一条消息通知后台线程更新缓存,后台线程收到消息后,在更新缓存前可以判断缓存是否存在,存在就不执行更新缓存操作;不存在就读取数据库数据,并将数据加载到缓存。这种方式相比第一种方式缓存的更新会更及时,用户体验也比较好。

在业务刚上线的时候,我们最好提前把数据缓起来,而不是等待用户访问才来触发缓存构建,这就是所谓的缓存预热,后台更新缓存的机制刚好也适合干这个事情。

http://www.lryc.cn/news/305193.html

相关文章:

  • 力扣日记2.22-【回溯算法篇】47. 全排列 II
  • 如何理解三大微分中值定理
  • Linux--自定义shell
  • AIGC 实战:Ollama 和 Hugging Face 是什么关系?
  • Gitee教程2(完整流程)
  • Go 1.22 中的 for 循环新特性详解
  • igolang学习2,golang开发配置国内镜像
  • R语言空间分析、模拟预测与可视化
  • 体育赛事直播系统软件开发
  • 使用 kind 集群安装运行极狐GitLab Runner【上】
  • wine 源码 vk3d wine-gecko wine-mono 各版本 国内下载地址 中国科技技术大学源
  • 【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)
  • jquery简介与解析
  • Apache Commons开源的工具库介绍
  • SQL语法法则
  • Java命令模式:让请求成为对象
  • 研究生摆烂摆烂的一个寒假
  • singularity-ce-4.1.0 + go 完整安装步骤,及报错解决
  • 笔记-电感充放电过程状态记录
  • 石头剪刀布游戏(C语言)
  • 《卓有成效的管理者》
  • 基于RK3399 Android11适配OV13850 MIPI摄像头
  • 学生个性化成长平台搭建随笔记
  • XTuner InternLM-Chat 个人小助手认知微调实践
  • 编程笔记 Golang基础 025 列表
  • Rollup + Ts
  • 5个精美的wordpress中文企业主题模板
  • 【数据分享】2011-2023年我国地级市逐月二手房房价数据(Excel/Shp格式)
  • 鸿蒙会成为安卓的终结者吗?
  • Sora横空出世!AI将如何撬动未来?