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

news2024/11/28 10:33:21

闲聊

缓存通用查询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 失败,则数据不一致
    缓存中使错误的数据,数据不一致,且高并发下问题更是严重
    在这里插入图片描述

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

在这里插入图片描述
3. 先删除缓存,在更新数据库
如果redis 删除成功, 数据库删除失败,则数据不一致
下面有问题的代码
在这里插入图片描述

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

处理办法1 延迟双删除
这个方案在第一次删除之后,延迟一段时间再次进行删除,所以我们把它叫做“延迟双栓”
在这里插入图片描述

  1. 先更新数据库,在删除缓存 (可用,也有问题,但是比上面的3种更好)
    如果mqsql成功,redis 失败,只要是mysql 是正确的,下次通过回写到reids,保证一致性
    ali的cannel也是这个思想, myssql有个中间件canel,可以完成biglog日志订阅功能。 先更新数据库,在更新缓存。
    在这里插入图片描述
如果上述的问题也不能容忍(在通过在get一次,以取得正确的数据),那我们只能借助mq与mysql的binlog日志了
![在这里插入图片描述](https://img-blog.csdnimg.cn/355cb7ab3eab4bc6a9122eea84ab8d82.png)

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

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

2.了解延迟双删吗

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

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

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

这种同步删除降低吞吐量怎么办?
因为要删除2次,所以吞吐量会降低,另起一个线程,异步删除。
在这里插入图片描述

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 时间不好估算
等待删除后,执行查询命令,不支持高并发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是可视化开发平台?拥有什么优势?

随着科技的进步和发展,可视化开发平台拥有广阔的市场前景,在提升企业办公企业效率、做好数据管理等方面具有自身的特色和优势。在办公自动化发展的年代,低代码开发平台是助力企业实现提质增效办公效率的得力助手,其可视化、易操作…

Windows操作系统存储管理——实存管理和虚存管理

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows操作系统存储管理——实存管理和虚存管理。 存储器管理的对象是主存(内存)。重点是要知道实存和虚存的管理,而虚存管理重点是逻辑地址和物理地址间的转…

桥梁结构健康监测解决方案

城市桥梁担负着城市的交通和运输网络的重要角色,是城市生命线的重要组成部分。然而,随着时间的推移和日益增长的负荷,桥梁可能会受到各种因素的损害,如自然灾害、疲劳、腐蚀等。因此,桥梁结构健康监测变得至关重要&…

osg给osg::Geometry(自己绘制的几何体)添加纹理(二)

目录 1. 前言 2. 自会集合体贴纹理 2.1. 一张图贴到整个几何体 2.2. 几何体每个面贴不同的图片纹理 3. 说明 1. 前言 前文讲述了如何给osg自带的几何体,如:BOX等,添加纹理,文章参考链接如下: osg给osg::Geometry&…

6步带你弄懂敏捷软件开发管理

敏捷开发是一种项目管理和软件开发的迭代方法,可帮助团队较快地为客户创造价值,同时减少问题。为了获得好处,软件项目团队需要知道如何正确使用敏捷管理方法。 了解敏捷宣言 敏捷宣言阐述了基本的价值观,还详细说明了敏捷团队应…

【云计算与虚拟化】第五章—— vCenter Server 5.5 的高级功能(三)

第五章—— vCenter Server 5.5 的高级功能(三) 1.使用vsphere client 登陆vcenter服务器,创建一个群集,名称为自己的学号,(截图) 2.针对该群集打开HA功能(截图) 3.接入控制策略选择…

【Linux安装】从无到有!在VM虚拟机上安装Linux

系列文章目录 文章目录 系列文章目录准备工作1、Linux阿里云iso镜像: [Centos7.9.2009](http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.5ec0f5adDd8whz) 一、在虚拟机上开辟空间 这里使用VM15做安装例子,16也同样适用1、打开VM 点…

ORB-SLAM内的卡方检验

ORB-SLAM内的卡方检验 1. 概念2. 卡方检验的基本思想3. 卡方检测示例4. ORB-SLAM2中卡方检测剔除外点的策略4.1 示例,卡方检验计算置信度得分: CheckFundamental()、CheckHomography() Reference: 卡方检验(Chi-square test/Chi-Square Goodness-of-Fit Test)卡方检…

chatgpt在复杂问题的回答表现

2023年东南大学论文:Evaluation of ChatGPT as a Question Answering System for Answering Complex Questions 代码库已经无法访问了:https://github.com/tan92hl/Complex-Question-Answering- Evaluation-of-ChatGPT 1.简介 复杂问题的回答&#xff…

ROS学习——在rviz中调用电脑摄像头

一、安装相关软件包 安装uvc camera sudo apt-get install ros-kinetic-uvc-camera安装image相关功能包 sudo apt-get install ros-kinetic-image-* sudo apt-get install ros-kinetic-rqt-image-view 要记得把kinetic换成 你自己的ros版本。 二、启动ros,调用…

我国中央商务区(CBD)的空间重构及发展模式

中央商务区(Central Business District,简称为CBD),原始意义为“商业会聚之地”是指一个国家或城市商务活动的主要集中的区域,是汇聚商务服务、金融服务、科技服务、咨询服务、会展服务、文化服务等服务业的集聚区域&a…

科海思针对锂盐溶液/锂电废水除钙镁、除硼、除铊的解决方案

碳酸锂是锂电行业阳极生产中的一个重要原材料,主要用于制造钴酸锂、镍酸锂、锰酸锂等电极材料,在充电锂电池中也用作非水溶液电解质等,具有良好的电化学性能,应用领域还在不断扩大。 工业级碳酸锂主含量(Li2CO3&#…

es elasticsearch 八 mapping 映射 、复杂数据类型

目录 Mapping 映射 复杂数据类型 Mapping 映射 精确匹配 必须和对应字段值安全一致才可查出 全文检索 缩写搜索全程、格式转换 大小写 同义词 全文检索核心原理 分词,初步的倒排索引的建立 重建倒排索引 时态转换、重复数的转换、同义词的转换、大小写的转换 …

公文写作素材:工作落实类过渡句50例

1.再美的发展蓝图,如果不能落到实处,都是纸上谈兵;再大的奋进决心,如果没有实际行动,对工作毫无益处。 2.会议提出的任务再明确不落实只是纸上谈兵,会议出台的措施再可行不担当只是空中楼阁。 3.既要有不…

buildroot简介

网址 官网:https://buildroot.org/ 下载地址:https://buildroot.org/download.html 使用 解压后,执行make menuconfig Target options (目标板配置) Target Architecture: 目标架构&#…

SpringCloud微服务踩坑系列-java.lang.IllegalStateException

异常如下: 2023-05-24 08:47:10.764 ERROR 118400 --- [nio-8084-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exceptio…

1978-2020年337个城市的原材料储备量数据

铜、钢、铝、木材、水泥等原材料是城市建设和经济发展的必备物质!厘清原材料的储备情况对于经济发展、资源可持续利用等都具有重要意义! 我们发现在Springer Nature平台上分享有1978-2020年我国337个城市的原材料储备量数据!该数据包括了337…

《Spring Guides系列学习》guide16 - guide20

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

【微博-计算Cell子控件的frame Objective-C语言】

一、计算Cell子控件的frame 1.来,看一下,刚才我们已经做到把这个模型设置给自定义的cell了吧, 那么,在这个自定义Cell里面呢,我们是不是要开始设置数据了, 设置数据,我们,设置数据,其实很简单,就是把我们这里边的每一个控件,对应的值,从模型里面取出来,给了它,…

挂耳式耳机品牌排行榜,看看谁被推荐上榜

下班路上就想放空自己刷会儿视频,但是马路、地铁还有公交上都会有嘈杂的声音影响,如果佩戴入耳式耳机放大声音不仅会过度屏蔽外界,同时还会损伤我们的耳朵,所以新近流行的开放式耳机很好的解决了这些问题,但也有很多小…