文章目录

  • 背景
    • 1.先更新redis再更新db
    • 2.先更新db再更新redis
    • 3.先更新DB再删除redis
    • 4.先删除redis再更新DB
    • 5.延迟双删
    • 6.思考变种
  • 总结
  • 适用场景

背景

本文结合一些自己理解,讲解cache miss等情况下如何保证缓存和db的一致性,下面的例子中缓存以redis为例

先redis,redis没有就读db

有几种

  1. 先更新redis再更新db
  2. 先更新db再更新redis
  3. 先更新DB再删除redis
  4. 先删除redis再更新DB
  5. 延时双删
  6. 延时双删变种

各种写场景与db redis一致性

1.先更新redis再更新db

按下面步骤会有问题,AB是两个线程

A_update_redis
B_update_redis
B_update_db
A_update_db

最终db是a值但是redis是b值,不一致

2.先更新db再更新redis

A_update_db
B_update_db
B_update_redis
A_update_redis

最终db是b值但是redis是a值

3.先更新DB再删除redis

A_update_db
B_update_db
B_rm_redis
A_rm_redis

是不是不明白。想不出来怎么不一致了?
不是这样的,没这么简单,第二次rm_redis就会保证后面的redis和db是一致的
实际是下面这种形式

A_get_data
redis_cache_miss
A_get_db
B_update_db
B_rm_redis
(此时如果拿db是b值,但是redis没有值)
A_update_redis

依赖于A_update_redis在B_update_db之后,极端情况
此时redis是old,db是new

4.先删除redis再更新DB

A_rm_redis
B_get_data
B_redis_miss
B_get_db
B_update_redis
A_update_db

此时redis是old值,db是new值

5.延迟双删

rm_redis
update_db
sleep xxx ms
rm_redis

这样叫做双删,最后一次sleep一段时间再rm_redis保证再次读请求回溯打到db,用最新值写redis

6.思考变种

上面的3和5情况可以直接变种,即

update_db
sleep xxx ms
rm_redis

解决了3中的极端情况(靠sleep解决),
并且减少5中第一次不必要的rm redis请求
当然,这个rm_redis还可以考虑异步化(提高吞吐)以及重试(避免异步处理失败),这里不展示

总结

从db回源到redis,需要考虑上面这些极端情况的case
其实还是推荐第五种,延时双删
最大限度上保证了db与redis的一致性
第六种变种虽然节省了删redis缓存的性能
但是某些极端场景,还是会有不一致的可能
比如A在更新db时,B来查询数据 则会不一致
但如果A删掉了缓存再去更新库,B去查库,就能保持一致了

适用场景

当然这些极端情况本身要求同一个key是多写的,这个根据业务需求来看是否需要,比如某些场景本身就是写少读多的

最终从网上看到的延迟双删变种为延迟删除redis也是一种优化

db与redis一致性解决策略:延时双删相关推荐

  1. Redis延时双删实现mysql和redis的数据一致性

    在高并发的业务场景下,为了保护数据库,我们一般都会做缓冲.所以,假设我们用redis做一个缓冲操作,让请求先访问redis,而不是直接访问mysql,来缓解数据库的压力. 平常的读取缓存没啥问题,但假 ...

  2. redis数据一致性之延时双删详解

    在使用redis时,需要保持redis和数据库数据的一致性,最流行的解决方案之一就是延时双删策略,今天我们就来详细刨析一下 注意:要知道经常修改的数据表不适合使用redis,因为双删策略执行的结果是把 ...

  3. redis 为什么说延时双删很扯淡

    什么是延迟双删: https://blog.csdn.net/huizhi2533/article/details/107021249/ redis和mysql数据一致性的问题 在这里,我们讨论三种更 ...

  4. MySQL与Redis一致性解决同步问题

    SpringBoot整合Redis的注解版本 @RestController public class MemberController { @Autowired private UserMapper ...

  5. 为什么说延时双删很扯淡

    redis和mysql数据一致性的问题 在这里,我们讨论三种更新策略: 先更新缓存,再更新数据库 先更新数据库,再更新缓存 先删除缓存,再更新数据库 先更新数据库,再删除缓存 第一种,先更新缓存,再更 ...

  6. redis的延迟双删策略总结

    1.什么是延迟双删? 延迟双删策略是分布式系统中数据库存储和缓存数据保持一致性的常用策略,但它不是强一致.其实不管哪种方案,都避免不了Redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,得要用 ...

  7. MySql与Redis延迟双删策略

    个人博客 欢迎访问个人博客: https://www.crystalblog.xyz/ 备用地址: https://wang-qz.gitee.io/crystal-blog/ 1. MySql与Re ...

  8. Redis 的过期策略是如何实现的?

    背景 为了减少占用内存空间,通常会对放到 Redis 中的键通过 expire 设置一个过期时间,那 Redis 是怎么实现对过期键删除的呢? 设置过期时间 设置过期时间的四种方式 # 将 key 的 ...

  9. Redis 缓存删除策略

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

最新文章

  1. 【转】推荐计算机科学类的经典书籍 3
  2. Ubuntu终端多窗口分屏Terminator
  3. MySQL优化--where条件字段的顺序对效率的影响 (02)
  4. PAT甲级1068 Find More Coins (30 分):[C++题解]DP、背包问题、dp输出方案
  5. python怎么换行输入而不执行_关于在IDLE中怎么换行继续敲写代码而不执行语句...
  6. 用 Python 在朋友圈中游遍全球
  7. java中队列的类是什么意思_java中LinkedList集合类实现栈和队列要注意什么?
  8. 列出连通集 (25 分)【DFS与BFS模板】
  9. 前端学习(2041)vue之电商管理系统电商系统之只是在发布阶段生效
  10. 近指针, 远指针和巨指针
  11. 001-spring结合quartz使用
  12. python和c++哪个好-python和C++语言哪个好?老男孩教育
  13. ISO14001认证用处有哪些?
  14. 360安全路由器外网连内网(端口映射)的设置方法
  15. 从草根到百万年薪程序员的二十年风雨之路。
  16. sql 按照天环比_同比环比sql实例
  17. 在使用pyplot时报错MatplotlibDeprecationWarning
  18. qt linux不能读写u盘文件,Qt读取U盘文件内容
  19. 打印zigtag矩阵
  20. Java编程入门---JDK安装

热门文章

  1. 解决VMware内存占用过高问题
  2. python里感叹号是什么意思_感叹号!代表什么意思?(标点符号的用法之感叹号)...
  3. html 自动填表,Delphi WEB网页自动填表
  4. 权限系统(前后端分离)
  5. 201612-3-炉石传说
  6. 2019年3月计算机科学ESI排名,2019年3月ESI中国大学综合排名百强出炉,88所院校有进步...
  7. 正电子发射计算机断层扫描质控检测,正电子发射计算机断层扫描(PET)
  8. 用C语言恢复误删文件,计算机里被删除的文件可以在哪里进行恢复?
  9. iphone文件app里无法连接服务器,苹果商店怎么打不开 无法连接到app store解决方法...
  10. 一寸照片电子版怎么弄?这两种方法要学会