关于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实战之Lettuce的使用技巧详解

    Redis实战之Lettuce的使用技巧详解

    Lettuce 是 Redis 的一款高级 Java 客户端,与 Jedis 并列成为最热门的客户端之一,目前已成为 SpringBoot 2.0 版本默认的 redis 客户端。本文主要和大家讲讲Lettuce的使用技巧,感兴趣的可以了解一下
    2022-12-12
  • Redis集群增加节点与删除节点的方法详解

    Redis集群增加节点与删除节点的方法详解

    这篇文章主要给大家介绍了关于Redis集群增加节点与删除节点的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Redis数据类型string和Hash详解

    Redis数据类型string和Hash详解

    大家都知道Redis中有五大数据类型分别是String、List、Set、Hash和Zset,本文给大家分享Redis数据类型string和Hash的相关操作,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • CentOS系统中Redis数据库的安装配置指南

    CentOS系统中Redis数据库的安装配置指南

    Redis是一个基于主存存储的数据库,性能很强,这里我们就来看一下CentOS系统中Redis数据库的安装配置指南,包括将Redis作为系统服务运行的技巧等,需要的朋友可以参考下
    2016-06-06
  • redis5集群如何主动手工切换主从节点命令

    redis5集群如何主动手工切换主从节点命令

    这篇文章主要介绍了redis5集群如何主动手工切换主从节点命令,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Redis中有序集合的内部实现方式的详细介绍

    Redis中有序集合的内部实现方式的详细介绍

    本文主要介绍了Redis中有序集合的内部实现方式的详细介绍,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Django使用redis配置缓存的方法

    Django使用redis配置缓存的方法

    Redis是一个内存数据库由于其性能极高,因此经常作为中间件、缓存使用,缓存某些内容是为了保存昂贵计算的结果,这样就不必在下次执行计算,接下来通过本文给大家分享redis配置缓存的方法,感兴趣的朋友一起看看吧
    2021-06-06
  • Redis过期Key删除策略和内存淘汰策略的实现

    Redis过期Key删除策略和内存淘汰策略的实现

    当内存使用达到上限,就无法存储更多数据了,为了解决这个问题,Redis内部会有两套内存回收的策略,过期Key删除策略和内存淘汰策略,本文就来详细的介绍一下这两种方法,感兴趣的可以了解一下
    2024-02-02
  • redis-trib.rb命令详解

    redis-trib.rb命令详解

    redis-trib.rb是官方提供的Redis Cluster的管理工具,无需额外下载,默认位于源码包的src目录下,但因该工具是用ruby开发的,所以需要准备相关的依赖环境,这篇文章主要介绍了redis-trib.rb命令详解,需要的朋友可以参考下
    2023-10-10
  • redis分布式锁的8大坑总结梳理

    redis分布式锁的8大坑总结梳理

    这篇文章主要介绍了redis分布式锁的8大坑总结梳理,使用redis的分布式锁,我们首先想到的可能是setNx命令,文章围绕setNx命令展开详细的内容介绍,感兴趣的小伙伴可以参考一下
    2022-07-07

最新评论