关于redis的延迟双删策略总结

 更新时间:2022年08月26日 11:19:12   作者:Hellboy_M  
这篇文章主要介绍了关于redis的延迟双删策略总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

redis延迟双删策略

1、什么是延迟双删?

延迟双删策略是分布式系统中数据库存储和缓存数据保持一致性的常用策略,但它不是强一致。其实不管哪种方案,都避免不了Redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,得要用到同步锁和对应的业务逻辑层面解决。

2、为什么要进行延迟双删?

一般我们在更新数据库数据时,需要同步redis中缓存的数据

所以存在两种方法:

  • 第一种方案:先执行update操作,再执行缓存清除。
  • 第二种方案:先执行缓存清除,再执行update操作。

这两种方案的弊端是当存在并发请求时

很容易出现以下问题:

  • 第一种方案:当请求1执行update操作后,还未来得及进行缓存清除,此时请求2查询到并使用了redis中的旧数据。
  • 第二种方案:当请求1执行清除缓存后,还未进行update操作,此时请求2进行查询到了旧数据并写入了redis。

3、如何实现延迟双删?

所以此时我们需要使用第三种方案:先进行缓存清除,再执行update,最后(延迟N秒)再执行缓存清除。

4、需要注意的点

上述中(延迟N秒)的时间要大于一次写操作的时间,一般为3-5秒。

原因:如果延迟时间小于写入redis的时间,会导致请求1清除了缓存,但是请求2缓存还未写入的尴尬。。。

ps:一般写入的时间会远小于5秒

5、小结

延迟双删用比较简洁的方式实现 mysql 和 redis 数据最终一致性,但它不是强一致。

延迟,是因为 mysql 和 redis 主从节点数据同步不是实时的,所以需要等待一段时间,去增强它们的数据一致性。

延迟是指当前请求逻辑处理延时,而不是当前线程或进程睡眠延迟。

mysql 和 redis 数据一致性是一个复杂的课题,通常是多种策略同时使用,例如:延迟双删、redis 过期淘汰、通过路由策略串行处理同类型数据、分布式锁等等。 

redis为什么要延时双删

首先,删除缓存是为了让其他事务读取数据的时候不会读到旧事务,而更新数据库前清除缓存和更新数据库后清除缓存解决的是不同时期的脏数据问题

只先删缓存的话,当我们在清除缓存和更新数据库间有事务查询缓存,此时没有缓存,数据库还没更新,所以缓存又更新为旧数据了

只后删缓存的话,在删除缓存之前读到的数据都是旧数据

那我们将两者综合起来的话,在更新前和更新后都进行删除,就可以很大程度上避免读到脏数据

那为什么要延时双删呢?我们考虑这样一种情况,在我们两次删除缓存之间更新数据库之前,B事务读到了数据库中的脏数据,但是他的时间片耗尽了,结果更新数据库的A事务进行了第二次清空缓存,时间片轮转回B时,B就会将旧数据缓存写进缓存当中去。此时我们使用延时双删策略,延后第二次删除缓存的时间,保证第二次删除缓存在所有的旧缓存之后,就可以确保不会有旧数据出现了

但是我们思考延时双删策略,此策略只能保证最终一致性,保证了第二次删除缓存之后的数据均为新数据,那第二次删除缓存之前还是能够读到旧数据的,如果对于数据没有强一致性要求的话延时双删已经足够了,但是如果对于数据有强一致性要求延时双删显然就不满足条件了,这个时候我们进一步优化的话可以考虑加锁操作,在写更新时阻塞读操作,带来的影响就是可以保证强一致性,但是吞吐量会下降 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis HyperLogLog数据量统计的实现实例

    Redis HyperLogLog数据量统计的实现实例

    在大数据时代,统计海量数据中的唯一值是一个常见的需求,但同时也是极具挑战性的任务,传统的统计方法可能会消耗大量内存或计算资源,而 Redis 的 HyperLogLog 数据结构 则提供了一种高效、轻量的解决方案,下面就来详细介绍一下HyperLogLog的使用,感兴趣的可以了解一下
    2025-09-09
  • Redis实现多人多聊天室功能

    Redis实现多人多聊天室功能

    这篇文章主要为大家详细介绍了Redis实现多人多聊天室功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • CentOS 6.6下Redis安装配置记录

    CentOS 6.6下Redis安装配置记录

    这篇文章主要介绍了CentOS 6.6下Redis安装配置记录,本文给出了安装需要的支持环境、安装redis、测试Redis、配置redis等步骤,需要的朋友可以参考下
    2015-03-03
  • Spring Boot 3.0x的Redis 分布式锁的概念和原理

    Spring Boot 3.0x的Redis 分布式锁的概念和原理

    Redis 分布式锁是一种基于 Redis 的分布式锁解决方案,它的原理是利用 Redis 的原子性操作实现锁的获取和释放,从而保证共享资源的独占性,这篇文章主要介绍了适合 Spring Boot 3.0x的Redis 分布式锁,需要的朋友可以参考下
    2024-08-08
  • 详解在Redis在Centos7上的安装部署

    详解在Redis在Centos7上的安装部署

    Redis是一种高级key-value数据库。这篇文章主要介绍了详解在Redis在Centos7上的安装部署,有兴趣的可以了解一下。
    2016-12-12
  • linux服务器中搭建redis6.0.7集群

    linux服务器中搭建redis6.0.7集群

    这篇文章主要介绍了linux服务器中搭建redis6.0.7集群的相关资料,需要的朋友可以参考下
    2022-11-11
  • Redis3.2开启远程访问详细步骤

    Redis3.2开启远程访问详细步骤

    redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf
    2018-03-03
  • SpringBoot整合Mybatis-plus和Redis实现投票功能

    SpringBoot整合Mybatis-plus和Redis实现投票功能

    投票功能是一个非常常见的Web应用场景,这篇文章将为大家介绍一下如何将Redis和Mybatis-plus整合到SpringBoot中,实现投票功能,感兴趣的可以了解一下
    2023-05-05
  • 如何自定义redis工具jar包供其他SpringBoot项目直接使用

    如何自定义redis工具jar包供其他SpringBoot项目直接使用

    这篇文章主要介绍了如何自定义redis工具jar包供其他SpringBoot项目直接使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • redis缓存存储Session原理机制

    redis缓存存储Session原理机制

    这篇文章主要为大家介绍了redis缓存存储Session原理机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11

最新评论