redis数据一致性之延时双删策略详解

 更新时间:2023年09月05日 11:11:27   作者:无形风  
在使用redis时,需要保持redis和数据库数据的一致性,最流行的解决方案之一就是延时双删策略,今天我们就来详细刨析一下,需要的朋友可以参考下

在使用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数据一致性之延时双删详解的文章就介绍到这了,更多相关redis延时双删内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux下redis的安装与使用图文教程

    Linux下redis的安装与使用图文教程

    这篇文章主要介绍了Linux下redis的安装与使用,结合图文形式分析了Linux环境下redis的下载、编译、安装、部署、访问等相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • redis与memcached的区别_动力节点Java学院整理

    redis与memcached的区别_动力节点Java学院整理

    Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器。那么redis与memcached有什么区别呢?下面小编给大家介绍下redis与memcached的区别,感兴趣的朋友参考下吧
    2017-08-08
  • 如何利用Redis作为Mybatis的二级缓存

    如何利用Redis作为Mybatis的二级缓存

    这篇文章主要介绍了如何利用Redis作为Mybatis的二级缓存,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Redis安装教程图解

    Redis安装教程图解

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。本文就教大家如何安装Redis,需要的朋友可以参考下
    2015-10-10
  • 基于redis乐观锁实现并发排队

    基于redis乐观锁实现并发排队

    这篇文章主要介绍了基于redis乐观锁实现并发排队的相关资料,需要的朋友可以参考下
    2022-12-12
  • Redis如何使用乐观锁(CAS)保证数据一致性

    Redis如何使用乐观锁(CAS)保证数据一致性

    本文主要介绍了Redis如何使用乐观锁(CAS)保证数据一致性,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Redis如何使用lua脚本实例教程

    Redis如何使用lua脚本实例教程

    这篇文章主要给大家介绍了关于Redis如何使用lua脚本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 关于Redis的内存淘汰策略详解

    关于Redis的内存淘汰策略详解

    当内存空间使用达到限制时,Redis 会根据配置策略来选择不同处理方式,要么返回 errors,要么按照不同的策略算法来清除一些旧数据,达到回收内存的目的,这就是 Redis 的内存淘汰,有些文章中,内存淘汰也叫缓存回收,需要的朋友可以参考下
    2023-05-05
  • Redis数据结构之intset整数集合使用学习

    Redis数据结构之intset整数集合使用学习

    这篇文章主要为大家介绍了Redis数据结构之整数集合使用学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Redis中缓存穿透/击穿/雪崩问题和解决方法

    Redis中缓存穿透/击穿/雪崩问题和解决方法

    大家好,本篇文章主要讲的是Redis中缓存穿透/击穿/雪崩问题和解决方法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦,方便下次浏览
    2021-12-12

最新评论