在使用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 为什么说延时双删很扯淡

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

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

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

  3. db与redis一致性解决策略:延时双删

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

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

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

  5. Redis五种基本数据类型底层详解(原理篇)

    Redis五种基本数据类型底层详解 详细介绍Redis用到的数据结构 简单动态字符串 SDS和C字符串的区别 总结 链表 字典 哈希表 字典 哈希算法 解决键冲突 rehash(重点) 渐进式reha ...

  6. mysql 点赞数据库设计_基于redis实现的点赞功能设计思路详解

    点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysq ...

  7. redis cluster 集群 安装 配置 详解

    redis cluster 集群 安装 配置 详解 张映 发表于 2015-05-01 分类目录: nosql 标签:cluster, redis, 安装, 配置, 集群 Redis 集群是一个提供在 ...

  8. redis cluster管理工具redis-trib.rb详解

    redis cluster管理工具redis-trib.rb详解 redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集 ...

  9. 开发中避免延时操作技巧详解

    这篇文章主要为大家介绍了开发中避免延时操作技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 前言 开发中我们或多或少会涉及到一些场景需要使用延时操作,而延时操作其实 ...

最新文章

  1. 在中断程序里修改全局变量的童鞋注意啦~(C中的volatile作用 转载~)
  2. c 语言中out的作用,C语言outData+是什么意思做什么用?
  3. 开发者该如何利用 C# 加解密?
  4. 对GCN,Transformer, XLNet, ALBERT, CRF等技术仍然一知半解?再不学习就OUT了!
  5. Python基于seaborn绘制喜欢的热力图,不同色系一览
  6. CentOS7上实现Squid缓存服务器的两种模式
  7. 阿里Sophix热修复接入指南
  8. redis雪崩、穿透、击穿的原因和解决方案
  9. 80端口被封 php跳转,80端口打不开网站问题
  10. DM642的PCI驱动编程笔记:缺页中断问题阐述以及与改变中断级相关的内核函数
  11. 每日一“酷”之Cookie
  12. fluid mask 3_CSS3 Fluid Layout和Media Queries:一种响应式Web设计的简单方法
  13. python使用“./“,“../“ ,“/“路径
  14. 树莓派安装Samba服务构建家庭NAS
  15. SVN clean up失败或是lock等问题解决方案
  16. available 的理解和一些使用
  17. Chrome插件开发、脚本开发笔记
  18. linux 命令集合1
  19. ARP代理与二层隔离技术
  20. 计算机专业考研电路原理,2019电子信息工程考研方向_电路与系统专业解读

热门文章

  1. 计算机术语位字节字字长分别是什么,字长、字节、字、字位的区别
  2. 用Python量化海龟交易法则
  3. Typora+MarkDown
  4. PDG FOR INDIE GAMEDEV
  5. 廊坊市计算机考试题库,河北省廊坊市2018_2019学年高二物理下学期期中试题(含解析)...
  6. Box2dの碰撞筛选[Ispooky]
  7. PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
  8. 【PS4开发】unity3d ps4手柄键位
  9. 结合FME利用倾斜三维模型数据成果生成DSM等数据产品
  10. 我们应该怎样面对自己