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

Redis维护缓存的方案选择

Redis中间件常常被用作缓存,而当使用了缓存的时候,缓存中数据的维护,往往是需要重点关注的,尤其是重点考虑的是数据一致性问题。以下是维护数据库缓存的一些常用方案。

1、先删除缓存,再更新数据库

导致数据不一致的场景:

最终结果:数据库存储的是新值,缓存存储的是旧值,导致数据不一致

2、先更新数据库,再删除缓存

最终结果:A线程删除缓存失败,导致缓存中一直存的是旧值。但是实际上,删除缓存失败这个异常场景不在此范围讨论中(可以加入重试机制),因此,此方案数据一致性问题不大,但是可能导致穿透问题(缓存数据删除后,瞬间大量请求穿过缓存,直接打到数据库。但是,但凡是删除缓存都有可能导致穿透问题)

3、先更新数据库,然后更新缓存

最终结果:更新缓存的时间不确定,有先有后,可能导致旧值覆盖新值的问题。而且性能不好,一万次请求就得更新一万次缓存。

4、延时双删

在方案一的基础上,增加了一次删除缓存的操作。回想方案一,导致数据不一致的问题是,A线程在B线程之后更新完数据库后,没有去处理缓存数据。因此,在更新完数据库后,再删除一次缓存便可(本质上就是方案一与方案二的结合)

总体流程:先删除缓存,然后再更新数据库,更新完数据库后,延时再删除一次缓存,做兜底操作。

更新数据库前删一次缓存,是因为,防止在更新数据库后的瞬间,有人直接命中缓存,拿到旧数据

更新数据库后再删一次缓存,是因为,有人通过查库拿到旧数据,设置值进了缓存(方案一数据不一致的情况),之所以要延时,是因为要保证,第二次删除的时机要在其他人写数据之后,否则白删。

注意:既然是删除缓存数据,依然会导致缓存穿透的问题。

根据实际业务场景,我选择了方案三:先更新数据库,再更新缓存。原因如下:

1、修改缓存的入口只有一个,在控制台中设置,不存在多个线程修改缓存的情况

2、读的入口有多个,有许多定时器会在自己的业务中读缓存值,有并发且量十分大,因此,需要考虑缓存穿透问题(不能删除缓存)

3、缓存中存的实际是业务配置,读多写少,大量更新操作导致性能消耗的场景不存在

每一种方案都存在他的优缺点。在理想中,我们往往希望能适用所有场景的方案,但是,现实往往很骨感,一劳永逸的方法几乎只存在于某个乌托邦。方案没有好坏之分,只有是否适合自己的应用场景之别。


http://www.kler.cn/news/136665.html

相关文章:

  • Kafka Tool(Offset Explorer)在windows下配置访问kerberos认证Kafka
  • 写在RAGFlow开源2万星标之际
  • 2005至2023年中国各地区数据要素化水平-最新出炉 附下载链接
  • OpenCV和HALCON
  • 502 错误码通常出现在什么场景?
  • 一、Linux 目录文件
  • 砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格
  • Java-抽象类、抽象方法
  • 竞赛选题 目标检测-行人车辆检测流量计数
  • 《Vue》——从新电脑开始搭建一个已有Vue2项目的环境
  • Trino 与Hive 有差异的函数
  • 北斗成为全球民航通用卫星导航系统
  • openRPA开源项目源码编译
  • IP地址定位是如何实现的?
  • 自动驾驶学习笔记(十)——Cyber通信
  • 梦想照进现实
  • GZ033 大数据应用开发赛题第07套
  • 九宫格 图片 自定义 路径
  • Jetson JetPack-5.1.2-L4T-R35.4.1 修复libvargus内存损坏问题
  • 在springBoot中同时使用mysql和MongoDB
  • vue3使用pinia实现数据缓存
  • 算法设计与分析算法实现——删数问题
  • Node.js环境配置级安装vue-cli脚手架
  • Java面试题07
  • 一文了解:离散型制造业轻量化MES解决方案
  • SD3403/SS928 烧录 Uboot Kernel Rootfs是什么