redis高级篇 缓存双写一致性之更新策略

这篇具有很好参考价值的文章主要介绍了redis高级篇 缓存双写一致性之更新策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

闲聊

缓存通用查询3部曲

  1. redis 中数据,返回redis 中的数据
  2. redis 中没有,查询数据库并返回
  3. 完成第二部的同时,将数据库查询结果写到redis,redis和数据库数据一致.

谈谈双写一致性的理解

1.如果redis 中有数据:需要和数据库中的相同
2.如果redis 中无数据: 数据库中的值如果是最新的,则要写入到redis

redis 缓存种类

  1. 只读(通过命令的方式写入,不是由我们的java程序,不常用)
  2. 读写(常用)

redis 读写缓存的策略

  1. 同步直写策略
    写数据后,也同步写到redis,缓存和数据库中的数据一致。
    对于读写缓存来说,要想保证缓存和数据库中的数据一致,就要采用同步直写策略
  2. 异步缓存策略
    正常业务运行中,一定时间后才将数据写到redis(比如下单后的快递信息)
    异常情况出现后,需要将失败的动作进行修补,有可能需要借助mq等消息队列。

问题

1. 如果使用redis,那就回涉及到redis 缓存与数据库双写问题。是先动redis呢,还是先动mysql?

首先我们的目的是明确的:就是保证redis和mysql的一致性。

给缓存设置过期时间,定期清理缓存并会写,是最终保证一致性的解决方案。
我们可以对缓存数据设置过期时间,所有的写以数据库为准,对缓存操作尽最大
努力即可。也就是说数据库写入成功,而缓存写入失败,那么只要达到过期时间,
则后面的请求会从数据库中读取新值回写缓存。从而达到最终一致性。

在了解一下4中更新策略

  1. 先更新数据库,在更新缓存
    如果更新mqsql 成功,redis 失败,则数据不一致
    缓存中使错误的数据,数据不一致,且高并发下问题更是严重
    redis高级篇 缓存双写一致性之更新策略

  2. 线程缓存,在更新数据库
    如果redis 成功,mqsql失败,则数据不一致

redis高级篇 缓存双写一致性之更新策略
3. 先删除缓存,在更新数据库
如果redis 删除成功, 数据库删除失败,则数据不一致
下面有问题的代码
redis高级篇 缓存双写一致性之更新策略

A线程执行下面的代码,删除缓存后,正在更新数据库,
线程B要获取这个缓存 ,没有查到,线程B就把数据回写到缓存,
然后线程A更新完数据库后,发现缓存还在
导致缓存中一直都是错的数据。

处理办法1 延迟双删除
这个方案在第一次删除之后,延迟一段时间再次进行删除,所以我们把它叫做“延迟双栓”
redis高级篇 缓存双写一致性之更新策略

  1. 先更新数据库,在删除缓存 (可用,也有问题,但是比上面的3种更好)
    如果mqsql成功,redis 失败,只要是mysql 是正确的,下次通过回写到reids,保证一致性
    ali的cannel也是这个思想, myssql有个中间件canel,可以完成biglog日志订阅功能。 先更新数据库,在更新缓存。
    redis高级篇 缓存双写一致性之更新策略
如果上述的问题也不能容忍(在通过在get一次,以取得正确的数据),那我们只能借助mq与mysql的binlog日志了
redis高级篇 缓存双写一致性之更新策略

1.我们可以监听 binlog 日志, 但我们知道那些key 和那些表的关系的时。我们便可以筛选出我们要监听的sql语句了。
2.当监听到 执行删除缓存关联的sql语句时,便把这个key放到消息队列。
3.通过mq 中消息执行删除操作。删除成功则已出,删除失败重试。如果重试次数较多,加入死信队列,后续处理,排查故障。

但是这样做有一定的延迟性。比如充值话费,高峰期;1分钟后到账。

2.了解延迟双删吗

延迟双删,
是指在第一次删除之后,延迟一段时间再次进行删除,所以我们把它叫做“延迟双栓”。 目的是 在第一次删除和第二次删除之前,防止有别的线程将值回写到reids.

线程A sleep的时间,需要大于线程B读取数据在写入缓存的时间。
这个时间该怎么确定呢?
第一种方法:
在业务运行的时候统计下线程读取数据与写回数据的时间 T1。结合自己业务,只要保证双删之间的时间 大于T1百毫秒即可。

第二种方法:
新启动后台监控程序,后面将会提到 watchDog监控程序。

这种同步删除降低吞吐量怎么办?
因为要删除2次,所以吞吐量会降低,另起一个线程,异步删除。
redis高级篇 缓存双写一致性之更新策略

3. 微服务查询redis无,mysql有。为了保证双写一致性,会写redis 时需要注意什么?,了解双检加锁吗,如何避免缓存击穿?

一般情况下,使用上面的缓存三部曲即可,但如果是高并发就不行了。想想看,
统一时刻有1000个请求过来,代码都执行 判断redis中有无数据,也就是要
1000次,接着因为redis中没有,又是1000次访问数据库,再接着又是1000次
的会写redis. 这个在高并发下,明显是不可取的。
所有出现 双检加锁。

那什么是双检加锁呢?

 public String doubleCheckCache() {
        // 先从redis 中查询
        String key = "user:1000";
        String s = stringRedisTemplate.opsForValue().get(key);
        if (!StringUtils.hasLength(s)) {
            // 加锁,防止qps高时,同时查到redis中无数据的情况下,继续访问数据库。防止缓存击穿。
            synchronized (this) {
                // 再次检查redis,第一个进入同步的线程,已经将数据写回了redis
                s = stringRedisTemplate.opsForValue().get(key);
                if (!StringUtils.hasLength(s)) {
                    //模拟查询数据库
                    s = "我是小明";
                    // 会写redis
                    stringRedisTemplate.opsForValue().setIfAbsent(key,s);
                    // 这里要考虑数据库如果为空的时候,要怀疑这ke能时恶意的,续作我们将其加入黑明单。
                }
            }
        }
        return s;
    }

5. redis 和mysql 100%会出纰漏,做不到强一致性,如何保证最终一致性?

消息队列,有延迟,
延迟双删除,线程A 时间不好估算
等待删除后,执行查询命令,不支持高并发文章来源地址https://www.toymoban.com/news/detail-464122.html

到了这里,关于redis高级篇 缓存双写一致性之更新策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis缓存(双写一致性问题)

    前言 : 什么是缓存? 缓存就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有\\\"避震器\\\", 防止 车体加速后因惯性,在酷似\\\"U\\\"字母的地形上飞跃,硬着陆导致的 损害 ,像个弹簧一样; 同样,实际开发中,系统也需要\\\"避震器\\\",防止过高的数据访问猛冲系统,导致其操作线程无法

    2024年02月02日
    浏览(25)
  • Redis缓存双写一致性

    如果redis中有数据:需要和数据库中的值相同 如果redis中无数据:数据库中的值要是最新值,且准备回写redis 缓存按照操作来分,可细分为两种: 只读缓存和读写缓存 只读缓存很简单:就是Redis只做查询,有就是有,没有就是没有,不会再进一步访问MySQL,不再需要会写机制

    2023年04月17日
    浏览(15)
  • Redis---缓存双写一致性

    目录 一、什么是缓存双写一致性呢?  1.1 双检加锁机制  二、数据库和缓存一致性的更新策略 2.1、先更新数据库,后更新缓存  2.2 、先更新缓存,后更新数据库  2.3、先删除缓存,在更新数据库 延时双删的策略:  2.4.先更新数据库,在删除缓存(常用) 2.5、实际中是不可

    2024年02月15日
    浏览(17)
  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(20)
  • 【Redis】聊一下缓存双写一致性

    缓存虽然可以提高查询数据的的性能,但是在缓存和数据 进行更新的时候 其实会出现数据不一致现象,而这个不一致其实可能会给业务来带一定影响。无论是Redis 分布式缓存还是其他的缓存机制都面临这样的问题。 数据一致性 缓存中有数据,那么缓存的数据和数据库的数据

    2024年02月06日
    浏览(22)
  • 缓存与数据库双写一致性几种策略分析

    作者:京东零售 于泷 在高并发场景中,为防止大量请求直接访问数据库,缓解数据库压力,常用的方式一般会增加缓存层起到缓冲作用,减少数据库压力。引入缓存,就会涉及到缓存与数据库中数据如何保持一致性问题,本文将对几种缓存与数据库保证数据一致性的使用方

    2023年04月19日
    浏览(25)
  • Redis缓存问题:穿透,击穿,雪崩,双写一致性等

    在高并发场景下,数据库往往是最薄弱的环节,我们通常选择使用 redis 来进行缓存,以起到缓冲作用,来降低数据库的压力,但是一旦缓存出现问题,也会导致数据库瞬间压力过大甚至崩溃,从而导致整个系统崩溃.今天就聊聊常见的 redis 缓存问题. 缓存击穿 缓存击穿一般指redis中的一

    2024年04月27日
    浏览(20)
  • 【redis】缓存双写一致性之工程落地实现(下)

    提示:以下是本篇文章正文内容,下面案例可供参考 如何监听MySQL的变动? MySQL有一个binlog日志 伪装成从机,从主机获取二进制文件 配置不在详述 配置不再详述 a、业务类: 当MySQL进行增删改操作时,后台的canal会立刻监听捕捉到MySQL的二进制binlog日志文件改动,并通过Jav

    2023年04月19日
    浏览(12)
  • Redis双写一致性?

    双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。 Redis作为缓存,mysql的数据如何与redis进行同步呢?(双写一致性) 1.我们当时做排行榜业务时,把历史榜单数据存储到了缓存中。这个虽然也是热点数据,但是实时要求性不高。

    2024年02月16日
    浏览(20)
  • 如何保证数据库和缓存双写一致性?

    如何保证数据库和缓存双写一致性,是面试中经常被问的一个技术问题,程序汪推荐大家有必要好好研究一波 数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问

    2024年01月18日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包