redis缓存延时双删的原因分析_Redis

来源:脚本之家  责任编辑:小易  

缓存为啥是删除,而不是更新?

如果是更新,存在分布式事务问题,可能出现修改了缓存,数据库修改失败的情况。只是删除缓存的话,就算数据库修改失败,下次查询会直接取数据库的数据,也不会出现脏数据。

延时双删是什么?

就是在增删改某实体类的时候,要对该实体类的缓存进行清空,清空的位置在数据库操作方法的前后。

采用反证法

只先删

????

在这里插入图片描述

只后删

在这里插入图片描述

结论

从而得出 前删和后删都有问题。所以采用延时双删的策略

思考2:为啥是延时

依然是反证法。下图这情况是双删依然存在旧缓存的情况,延时是确保 修改数据库-》清空缓存前,其他事务的更改缓存操作已经执行完。

在这里插入图片描述

补充:为什么要延迟双删,来保证缓存一致性

为什么要延迟双删,来保证缓存一致性

在修改数据库数据前,需要先删除一次redis:此时是为了保证在数据库数据修改和redis数据被删除的间隔时间内,如有命中,保证此数据也不存在redis中。如果没有这一次删除,当数据库数据已经被修改了,但是还是可以从redis中读出旧数据,导致数据不一致。第二次删除则是在修改数据库数据后,此时需要再次删除redis中对应数据一次,这一次是为了删除 第一次redis删除和数据库数据修改之间,如果有请求,那么旧数据又会重新缓存到redis中,然而数据在数据库中在接下来就会被修改,如果没有这一次删除,redis中则会存在数据库中旧的数据。那么第二次为什么需要在数据库修改后延迟一定时间再删除redis呢?为了等待之前的一次读取数据库,并等待其数据写入到缓存,最后删除这次脏数据,所以是一次数据从数据库中发到服务器+缓存写入的时间

延迟双删为什么要延迟

但是延迟双删,所延迟的时间非常的难以确定,所以并不推荐延迟双删

根据综合考虑,即使先修改数据库,在删除缓存,有一定的时间会导致读取到旧数据,这通常是可以被忍受的。
只要及时将缓存删除,其他线程就可以读取到最新的值。

同时为了保证缓存一定会被删除,可以采用mq,来保证缓存会被删除

如果在mq中消息没有被重复消费,还会交由给其他消费者消费(将缓存删除)

到此这篇关于redis缓存延时双删的原因分析的文章就介绍到这了,更多相关redis缓存延时双删内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:基于?Spring?Aop?环绕通知实现?Redis?缓存双删功能(示例代码)基于Redis实现延时队列的优化方案小结Java实现Redis延时消息队列redis实现延时队列的两种方式(小结)

  • 本文相关:
  • redis ip地址的绑定的实现
  • redis和springboot 整合redisutil类的示例代码
  • window手动操作清理redis缓存的技巧总结
  • 基于redis+lua脚本实现分布式限流组件封装的方法
  • redis sentinel实现高可用配置的详细步骤
  • 关于redis数据库入门详细介绍
  • 基于redis位图实现用户签到功能
  • windows环境下redis cluster环境搭建(图文)
  • redis对批量数据实现分布式锁的实现代码
  • 在redis数据库中实现分布式速率限制的方法
  • redis双删和最后删一次区别?
  • redis或者缓存系统有批量删除的机制吗
  • g-boot-starter-data-redis 怎样删除缓存
  • redis怎么查询key和删除缓存
  • net redis key缓存过期时间,有查询操作是否也会删除
  • g-data-redis以List方式存储,怎么删除缓存数据
  • g-data-redis以List方式存储,怎么删除缓存数据
  • 使用redis缓存之后 页面老是刷新不出来是什么原因
  • 我配置了redis注解缓存,为什么不起作用
  • Redis等缓存数据库为什么访问会比较快
  • spring为什么要用redis缓存
  • redis mybatis 二级缓存 为什么必须要有 <property name="co...
  • 为什么redis没有缓存有数据
  • 一个面试问题,为什么用redis做缓存
  • java 为什么可以用 redis 做缓存
  • 对于缓存在redis中且不会改变的数据并发读为什么还会出现QP...
  • php 分页查询怎么redis缓存
  • 为什么redis在java是同步缓存,而在nodejs是异步缓存
  • 为什么redis在java是同步缓存,而在nodejs是异步缓存
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页基于?spring?aop?环绕通知实现?redis?缓存双删功能(示例代码)基于redis实现延时队列的优化方案小结java实现redis延时消息队列redis实现延时队列的两种方式(小结)redis ip地址的绑定的实现redis和springboot 整合redisutil类的示例代码window手动操作清理redis缓存的技巧总结基于redis+lua脚本实现分布式限流组件封装的方法redis sentinel实现高可用配置的详细步骤关于redis数据库入门详细介绍基于redis位图实现用户签到功能windows环境下redis cluster环境搭建(图文)redis对批量数据实现分布式锁的实现代码在redis数据库中实现分布式速率限制的方法超强、超详细redis数据库入门教程redis常用命令、常见错误、配置技巧等分享redis操作命令总结redis中5种数据结构的使用场景介绍redis 密码设置和查看密码的方法64位windows下安装redis教程redis中使用redis-dump导出、导入、还原数据实例推荐几款 redis 可视化工具(太厉害了)redis中统计各种数据大小的方法redis常用命令小结redis之sds数据结构的使用通过 redis 实现 rpc 远程方法调用(支持多种编程语言)redis搭建哨兵集群的实现步骤win10下通过ubuntu安装redis的过程redis如何后台启动的方法在redis集群中使用pipeline批量插入的实现方法redis 命令整理并说明如何使用redis基本数据类型set常用操作命令虚拟机linux安装redis实现过程解析redis中的动态字符串学习教程
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved