0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL与Redis延迟双删策略

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-25 14:28 次阅读

背景

在当前环境下,通常我们会首选redis缓存来减轻我们数据库访问压力。但是也会遇到以下这种情况:大量用户来访问我们系统,首先会去查询缓存, 如果缓存中没有数据,则去查询数据库,然后更新数据到缓存中,并且如果数据库中的数据发生了改变则需要同步到redis中,同步过程中需要保证 MySQL与redis数据一致性问题,在这个同步过程中出现短暂的数据延迟也是正常现象,但是最终需要保证mysql与缓存中的一致性。

//我们通常使用redis的逻辑
    //通常我们是先查询reids
    String value = RedisUtils.get(key);
    if (!StringUtils.isEmpty(value)){
        return value;
    }
//从数据库中获取数据
    value = getValueForDb(key);
    if (!StringUtils.isEmpty(value)){
           RedisUtils.set(key,value);
        return value;
     }

1、什么是延迟双删?

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

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

一般我们在更新数据库数据时,需要同步redis中缓存的数据 所以我们一般会给出两种方案:

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

但是这两种方案在并发请求中容易出现以下问题

图片

  • 第一种方案弊端:当请求1去执行数据库更新操作之后,还没执行缓存清除时,请求2就进来了查询了缓存,此时缓存中数据还是旧数据,还没来得机删除导致数据出现问题,但是当t1执行缓存删除操作之后,后面的请求查询不到缓存,再到数据中查询,然后更新到缓存中,这种影响是比较小的
    1. t1线程 先更新db;
    2. t2线程查询命中缓存 返回旧的数据;
    3. 假设t1线程更新完db,预计5毫秒删除完缓存key 在5毫秒内 其他线程查询缓存结果还是为旧的数据,但是 5毫秒后查询缓存结果是为空,在从新将db最新的结果同步到Redis中。
    4. 一个项目中出现延迟是非常正常的,所以该情况发生的延迟对业务的影响其实很小。但是如果发生了,删除缓存失败呢?

1.不断重试----如果是在http协议接口中 会导致接口响应变慢 调用该接口 会发生响应超时 2.或者通过mq异步的形式同步

图片

  • 第二种方案弊端:当请求1执行清除缓存后,还未执行数据更新操作的时,请求2进来查询到数据库的旧数据,并写入了redis,这就导致了数据库与redis数据不一致问题。
    1. t1线程先删除缓存;
    2. t2线程读取缓存为null,同步db数据到缓存中;
    3. t1线程更新db中的数据;
    4. t3线程查询缓存中数据是旧数据;

3、对于方案处理都有弊端,那么我们需要使用延迟双删策略

先进行缓存清除,再执行update,最后(延迟N秒)再执行缓存清除。进行两次删除,且中间需要延迟一段时间

RedisUtils.del(key);// 先删除缓存
    updateDB(user);// 更新db中的数据
    Thread.sleep(N);// 延迟一段时间,在删除该缓存key
    RedisUtils.del(key);// 先删除缓存

4、需要注意的点

上述中(延迟N秒)的时间要大于一次写操作的时间。原因:如果延迟时间小于写入redis的时间,会导致请求1清除了缓存,但是请求2缓存还未写入的尴尬。。。

5、延迟的时间如何确定?

在业务程序运行时,统计业务逻辑执行读数据和写缓存的操作时间,以此为基础来进行估算。因为这个方案会在第一次删除缓存值后,延迟一段时间再次进行删除,所以称为“延迟双删”。

小结

延迟双删策略只是一种同步数据库与缓存的手段,在系统并发量不高的情况下可以使用这种方式解决。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4202

    浏览量

    85533
  • 缓存
    +关注

    关注

    1

    文章

    229

    浏览量

    26623
  • 数据库
    +关注

    关注

    7

    文章

    3750

    浏览量

    64207
  • MySQL
    +关注

    关注

    1

    文章

    795

    浏览量

    26379
  • Redis
    +关注

    关注

    0

    文章

    370

    浏览量

    10820
收藏 人收藏

    评论

    相关推荐

    Redis缓存和MySQL数据不一致原因和解决方案

    高并发架构系列:Redis缓存和MySQL数据一致性方案详解
    发表于 03-27 15:55

    Redis的内存淘汰机制

    redis淘汰策略
    发表于 09-27 07:55

    浅析Redis的过期机制

    Redis数据过期策略详解
    发表于 10-12 15:12

    简单介绍MySQL延迟主从复制

    MySQL 5.6 已经支持延迟复制, 可设置备节点的延迟时间, 延迟复制是有意义的,例如防止主节点数据误删,查看数据库历史状态等。
    的头像 发表于 02-09 09:05 4013次阅读

    redis缓存mysql数据

    RedisMysql数据库缓存,必须解决2个问题。首先,应该确定用何种数据结构存储来自Mysql的数据;在确定数据结构之后,还要考虑用什么标识作为该数据结构的键。
    的头像 发表于 02-09 15:42 4025次阅读

    RedisMySQL保持数据统一的方法介绍

    在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。
    的头像 发表于 09-28 02:42 2201次阅读
    <b class='flag-5'>Redis</b>和<b class='flag-5'>MySQL</b>保持数据统一的方法介绍

    mysql_redisMySQL中操作Redis 

    ./oschina_soft/gitee-mysql_redis.zip
    发表于 06-22 14:35 2次下载
    <b class='flag-5'>mysql_redis</b>在<b class='flag-5'>MySQL</b>中操作<b class='flag-5'>Redis</b> 

    先写 Redis再写 MySQL的区别

    请求 A、B 都是先写 MySQL,然后再写 Redis,在高并发情况下,如果请求 A 在写 Redis 时卡了一会,请求 B 已经依次完成数据的更新,就会出现图中的问题。
    发表于 03-01 12:25 669次阅读

    Redis10大性能优化策略

    例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了
    的头像 发表于 07-04 10:21 802次阅读
    <b class='flag-5'>Redis</b>10大性能优化<b class='flag-5'>策略</b>

    Redis 的数据清理策略

    本文整理 Redis 的数据清理策略所有代码来自 Redis version :5.0, 不同版本的 Redis 策略可能有调整
    发表于 09-19 14:24 327次阅读
    <b class='flag-5'>Redis</b> 的数据清理<b class='flag-5'>策略</b>

    Redis的删除策略和内存淘汰机制介绍

    Redis过期键的删除策略Redis的过期删除策略就是:惰性删除和定期删除两种策略配合使用。 惰性删除:
    的头像 发表于 10-09 11:06 450次阅读

    SpringBoot AOP + Redis 延时功能实战

    注意:要知道经常修改的数据表不适合使用Redis,因为策略执行的结果是把Redis中保存的那条数据删除了,以后的查询就都会去查询数据库。
    的头像 发表于 10-13 16:08 592次阅读
    SpringBoot AOP + <b class='flag-5'>Redis</b> 延时<b class='flag-5'>双</b><b class='flag-5'>删</b>功能实战

    redismysql的区别

    RedisMySQL是两种常见的数据库管理系统,两者在很多方面存在差异,本文将详细分析RedisMySQL的区别。 数据模型: Redis
    的头像 发表于 11-16 11:21 996次阅读

    redismysql如何保持数据一致性

    RedisMySQL是两个常用的数据库系统,它们都有自己的特点和用途。在某些场景下,我们可能需要将RedisMySQL进行结合使用,并保持数据的一致性。 一、
    的头像 发表于 11-16 11:27 877次阅读

    redis的淘汰策略

    Redis是一种基于内存的键值存储系统,为了充分利用内存,Redis采用了一些淘汰策略来管理内存空间。淘汰策略的作用是当内存空间不足时,选择合适的数据对象进行淘汰,释放出更多的内存空间
    的头像 发表于 12-04 16:23 507次阅读