在使用redis时,需要保持redis和数据库数据的一致性,最流行的解决方案之一就是延时双删策略,今天我们就来详细刨析一下

注意:要知道经常修改的数据表不适合使用redis,因为双删策略执行的结果是把redis中保存的那条数据删除了,以后的查询就都会去查询数据库。所以redis使用的是读远远大于改的数据缓存。

1,首先要理解在并发环境下redis数据一致性的问题所在

在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,
修改请求的实现中需要修改数据库后,级联修改redis中的数据。
请求一:1.1修改数据库数据       1.2 修改redis数据
请求二:2.1修改数据库数据       2.2 修改redis数据
并发情况下就会存在1.1 ---> 2.1 ---> 2.2 ---> 1.2的情况
(一定要理解线程并发执行多组原子操作执行顺序是可能存在交叉现象的)此时存在的问题就是:1.1修改数据库的数据最终保存到了redis中,2.1在1.1之后也修改了数据库数据。此时出现了redis中数据和数据库数据不一致的情况,在后面的查询过程中就会长时间去先查redis,从而出现查询到的数据并不是数据库中的真实数据的严重问题。
问题解决:修改数据库级联修改redis数据改为  修改数据库数据后级联删除redis数据至于是先执行1.2的redis删除,还是限制性2.2的redis删除,无关紧要。结果都是redis中数据已被删除。之后的查询就会由于redis中没有数据而去查数据库,此时即不会存在查询到的数据和数据库的数据不一致的情况。

2,上面详解了redis数据一致性的问题所在,并提供了单删策略来解决问题
但此时依然存在比较严重的问题。

上面的单删策略情况如下:
修改请求的实现中需要修改数据库后,级联删除redis中的数据。
请求一:1.1修改数据库数据       1.2 删除redis数据
请求二:2.1修改数据库数据       2.2 删除redis数据假设现在并发存在一个查询请求
请求三:3.1查询redis中数据   3.2查询数据库数据    3.3 新查到的数据写入redis
(一定要理解带redis的查询请求实现逻辑,先查redis,数据不存在查数据库,查到的数据写入redis以便以后的查询不去直接查数据库)此时并发情况下就会存在1.1 ---> 1.2 ---> 3.1 ---> 3.2 ---> 2.1 ---> 2.2 ---> 3.3的情况 此时存在的问题就是:此时数据库中的数据保存的是2.1修改后的数据,而redis中保存的数据是3.2中在1.1修改数据后的结果,此时出现了redis中数据和数据库数据不一致的情况,在后面的查询过程中就会长时间去先查redis,从而出现查询到的数据并不是数据库中的真实数据的严重问题。

3,上面刨析到了单删策略来解决redis数据一致性存在的问题,下面我们来说双删策略

上面的单删策略存在问题的情况如下:
请求一:1.1修改数据库数据       1.2 删除redis数据
请求二:2.1修改数据库数据       2.2 删除redis数据
请求三:3.1查询redis中数据   3.2查询数据库数据    3.3 新查到的数据写入redis添加延时双删策略后的情况
请求一:1.1修改数据库数据       1.2 删除redis数据    1.3 延时3--5s再去删除redis中数据
请求二:2.1修改数据库数据       2.2 删除redis数据    2.3 延时3--5s再去删除redis中数据
请求三:3.1查询redis中数据     3.2 查询数据库数据    3.3 新查到的数据写入redis双删策略为什么能解决问题:
因为存在了延时时间,故1.3或2.3 一定是最后执行的一步操作(并发中的延时一定要理解)
延时的根本目的就是为了让程序先把3.3执行完,再去删除redis

4,如何实现延时3–5s的操作

比较好的:   项目整合quartz等定时任务框架,去实现延时3--5s再去执行最后一步任务
比较一般的:  创建线程池,线程池中拿一个线程,线程体中延时3-5s再去执行最后一步任务(不能忘了启动线程)
比较差的:   单独创建一个线程去实现延时执行

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. db与redis一致性解决策略:延时双删

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

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

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

  6. MySql与Redis延迟双删策略

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

  7. 如何保证Redis缓存与数据库的一致性?

    目录 1.四种同步策略: 2.更新缓存还是删除缓存 2.1 更新缓存 2.2 删除缓存 3.先操作数据库还是缓存 3.1 先删除缓存再更新数据库 3.2 先更新数据库再删除缓存 4.延时双删 4.1 ...

  8. 58一面:Redis数据更新,是先更新数据库还是先更新缓存?

    作者 | ^Damon 来源 | blog.csdn.net/qq_41689567/article/details/103664475 项目部分: 1.项目背景还有项目流程 2.从抓包开始到最终显示 ...

  9. 一问Redis只知道是key-value类型数据库?它可远不止这些!

    欢迎访问我的blog http://www.codinglemon.cn/ 立个flag,8月20日前整理出所有面试常见问题,包括有: Java基础.JVM.多线程.Spring.Redis.MySQ ...

  10. redis和数据库的一致性问题的解决方案

    当前没有框架能够保证redis的数据和数据库的完全一致性,所以需要 我们自己在性能和一致性上作取舍. 使用到缓存的场景 这里讲到的是缓存和数据库的一致性问题.当查询数据库数据的时候,才涉及到缓存的利用 ...

最新文章

  1. javascript的特点
  2. 【Airtest】Airtest中swipe方法兼容不同分辨率的解决方法
  3. .net core 文件流保存图片_使用JSDelivr加速Github、博客文件
  4. 科学计算机怎么调亮度,LED显示器背光很刺眼怎么办?显示器刺眼如何设置?
  5. cocos2d-x3.6 连连看连通画线
  6. python快速排序函数_python算法-快速排序
  7. C语言学习笔记(1)--基本概念和函数用法
  8. oracle 同一列数据不同条件分组求和_艾瑞教育:有关Oracle数据库,你需要知道的几件事...
  9. Linux该如何学习(新手入门必看)
  10. MySQL 8.0窗口函数
  11. 服务器常见问题,如何解决“远程服务器返回错误”?
  12. STM32L系列与普通STM32F系列的比较
  13. 百度AI平台申请使用流程
  14. Thunder v7.9.5.4480 Ayu 优化版
  15. 微信小程序getPhoneNumber获取手机号,解决code失效问题
  16. 《程序是怎么跑起来的》第一章学习笔记
  17. 八皇后问题(又名: 高斯八皇后)
  18. linux 换一个路径存储新的挂载nas盘
  19. C# 保存窗口为图片(保存纵断面图)
  20. spring boot多数据源配置示例

热门文章

  1. 使用回溯算法结合递归树+备忘录解决01背包问题
  2. Java入门——第九天
  3. bzoj1096 [ZJOI2007]仓库建设(斜率)
  4. MySQL恢复备份读书笔记
  5. cocos2d 帧序列动画
  6. Android保存多张图片到本地
  7. 陌上花开(三维偏序)(cdq分治)
  8. PHP和Java的主要区别有哪些呢?
  9. myeclipse激活+Aptana安装配置
  10. mysql workbench 建表时PK, NN, UQ, BIN, UN, ZF, AI