Redis数据一致解决方案

news2025/1/23 2:00:26

文章目录

    • 前言
    • 技术积累
      • 查询缓存业务流程
      • 更新缓存业务流程
    • 更新缓存问题
    • 解决方案
    • 写在最后

前言

当前的应用服务很多都有着高并发的业务场景,对于高并发的解决方案一般会用到缓存来降低数据库压力,并且还能够提高系统性能减少请求耗时,比如我们常用的redis缓存。当然,一般业务在更新要刷新缓存,但是如果采用的方式方法不对是会造成数据不一致的情况,让用户拿到错误的缓存数据。今天,就来讨论一下缓存与数据不一致的原因并提供解决方案。

在这里插入图片描述

技术积累

查询缓存业务流程

在这里插入图片描述

查询步骤:
1、请求打到服务端首先到redis查看是否存在缓存
2、存在缓存直接返回前端,不存在直接查询数据库
3、查询数据库存在写入缓存并返回,不存在则写入布隆过滤器返回

注意:在写入缓存的步骤需要加上分布式锁并设置未获取到锁立即失败的策略,以防止高并发下多个线程争抢资源的情况。

为什么数据库没有会写入布隆过滤器?

主要用来解决redis缓存击穿。

布隆过滤器的主要原理是使用一组哈希函数,将元素映射成一组位数组中的索引位置。当要检查一个元素是否在集合中时,将该元素进行哈希处理,然后查看哈希值对应的位数组的值是否为1。如果哈希值对应的位数组的值都为1,那么这个元素可能在集合中,否则这个元素肯定不在集合中。

更新缓存业务流程

在这里插入图片描述

以上是常规的新增缓存的业务流程,其步骤是:
1、业务更新数据
2、刷新缓存

更新缓存问题

以上更新缓存有什么问题?

如果并发量不高的情况下,可能用户并不会发现缓存与数据库不一致的情况。

但是在高并发的情况下,A线程新增数据后还没有来得及刷新缓存,线程B又修改了数据库数据并刷新了缓存,此时线程A由于运行太慢才拿着A的数据去刷新缓存,这样就导致redis数据是A线程的数据与数据库B线程数据不一致。

当然,有的同学可能会采用先删除缓存后更新业务数据库的策略,比如线程A刚刚删除了缓存还没有更新数据库,线程B访问了就立即会讲数据库数据加入缓存并返回,然后A线程继续更新业务数据库。导致redis数据是B线程数据与数据库A线程数据不一致。

所以,如果你的业务系统对缓存敏感就必须要解决缓存不一致的问题。

解决方案

1、redis延迟双删
在这里插入图片描述

1.1 具体的操作步骤:
先删除缓存;
再写数据库;
休眠300毫秒 休眠时间根据自身业务情况进行增减;
再次删除缓存。

1.2 设置缓存过期时间
从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

方案的缺点
结合双删策略+缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致,而且又增加了写请求的耗时。

2、异步更新缓存(基于订阅binlog的同步机制)

在这里插入图片描述

2.1 方案一手动监听mysql binlog+消息队列mq
项目启动立即将缓存全量加入redis;
我们不再关心业务数据跟新,直接加上事务写入mysql数据库即可,此时mysql会产生binlog日志;
mq生产者监听mysql binlog,发现binlog变动将具体的日志发送到mq相关队列
mq消费者监听到有消息立即消费,并解析出具体的数据调用redis更新

2.2 方案二开源中间件canal
其实canal的思路与方案一差不多,不同的是canal将自己伪装成一个mysql slave从节点。

大家应该都知道mysql主从同步的原理:
当mysql slave连接到master节点时,master会开一个binlog dump线程来监听binlog变化,slave也会开启一个IO线程。当有数据变更的时候,binlog dump线程就会将日志名字和同步位置等信息发送给slave IO线程,slave IO线程会根据接收到的同步信息去master拉取binlog并保存到自己的relay log中继日志中。这个时候slave节点的sql 线程会不断地从relay log中继日志将数据写入数据库。

具体步骤:
canal的服务端启动伪装为mysql slave注册到mysql 集群
canal服务端拿到binlog日志后会进行解析和封装为带有DML语句的对象数据
canal服务端创建线程将封装好的对象数据发送到消息队列mq
canal客户端会监听具体的消息队列,获取到具体的DML语句进行解析
canal客户端创建线程对redis进行操作

写在最后

在高并发的业务场景下redis与mysql数据库非常容易产生数据不一致的情况,我们可以采用redis缓存延迟双删除策略达到数据的最终一致性,也可以采用一部缓存更新自定义监听mysql binblog和采用canal开源中间件实现缓存的实时一致性方案。总的来说,都是比较简单的,而且都能够达到良好的效果。

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

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

相关文章

西南交通大学【数电实验之modelsim的使用】

由于后面的实验和考试时的仿真全部用modelsim,所以出一期modelsim的使用。 一、准备工作 1.找到modelsim 可以将其拖到桌面上。 2.Quartus的准备 这里以笔者考试时的代码为例,代码如下图所示 是产生一个周期性的110100序列。 在编写好代码后&#x…

【redis笔记】

Redis简介 安装步骤 Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型: 字符串string ​ 哈希hash 适合存储对象 列表list 按照插入顺序排序,可以有重复元素 集合set 无序集合,没…

Gartner2023数据库魔力象限发布 阿里云依旧领导者 腾讯退出 EDB/Yugabyte进入

这是一个跨越数年的系列,历史文章参考: * 数据库魔力象限2022:阿里领先、腾讯再次进入 * 2021 藏在魔力象限中的数据库江湖 * Gartner云计算魔力象限2018 概述 Gartner云数据库魔力象限(后简称“象限”或“MQ”)一…

力扣日记12.23-【二叉树篇】501. 二叉搜索树中的众数

力扣日记:【二叉树篇】501. 二叉搜索树中的众数 日期:2023.12.23 参考:代码随想录、力扣 501. 二叉搜索树中的众数 题目描述 难度:简单 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出…

设计模式(4)--对象行为(2)--命令

1. 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请 求日志,以及支持可撤销的操作。 2. 四种角色 接收者(Receiver)、抽象命令(Command)、具体命令(Concrete Command)、请求者(Invoker) 3. 优点…

TCP_滑动窗口介绍

简介 TCP协议中有两个窗口,滑动窗口和拥塞窗口,两者均是一种流控机制;滑动窗口是接收方的流控机制,拥塞窗口是发送方的流控机制。 本文介绍滑动窗口,接收方为TCP连接设置了接收缓存。当TCP连接接收到正确、按序的字节…

idea运行tocmat报错

1.检查环境变量是否配置正确。 网上有许多配置tomcat环境变量的方法,这里不再赘述。 2.判断是否有该情况: 在tomcat的bin目录下有三个bat文件(startup.bat,shutdown.bat,catalina.bat),随意双击一个,会报出上述错误。但是右键使…

JavaScript高级 函数进阶篇

函数进阶 1、函数的定义和调用 函数声明方式function关键字(命名函数);函数表达式(匿名函数);new Function()(此处的Function()是一个构造函数);var fn new Function(参…

华为鸿蒙(HarmonyOS):连接一切,智慧无限

华为鸿蒙是一款全场景、分布式操作系统,旨在构建一个真正统一的硬件生态系统。该操作系统于2019年8月首次发布,并被设计为可以应用于各种设备,包括智能手机、智能手表、智能电视、车载系统等多种智能设备。 推荐一套最新版的鸿蒙4.0开发教程 …

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…

antdv中的slider组件会默认将min值传递给value

如果是使用响应式变量,会将min的值传递到v-model对应的变量里

with torch.no_grad()在Pytorch中的应用

with torch.no_grad()在Pytorch中的应用 参考: https://blog.csdn.net/qq_24761287/article/details/129773333 https://blog.csdn.net/sazass/article/details/116668755 在学习Pytorch时,老遇到 with torch.no_grad(),搞不清其作用&#…

Deployment Controller详解(下)

上一篇在《Deployment Controller详解(上)》中介绍了Deployment Controller 的创建、更新和回滚。了解了这三个功能,基本上也就懂得了大厂PaaS平台中服务的灰度升级、失败回滚等操作是如何实现的了。 接下来本文会介绍Deployment Controller…

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

1.NVIDIA驱动检测及安装 1.1 查看显卡信息 # 显示系统中所有通过PCI总线连接的VGA兼容控制器信息。包括集成显卡即与CPU内置在同一块芯片上的显卡)以及独立显卡。 lspci | grep VGA # 将显示有关系统中所有NVIDIA显卡的信息。 lspci | grep NVIDIA 解释&#xf…

【数据结构之顺序表】

数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…

智能优化算法应用:基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MA…

国产AI大模型与ChatGPT的差距到底有多大?

据不完全统计,截止今年10月,中国已经发布了238个大模型。IDC预测,2026年中国人工智能软件及应用市场规模将达到211亿美元,人工智能将进入大规模落地应用关键期。 有报告分析发现,中国自2020年进入大模型加速发展期&am…

GPTs 官方榜单 Top10,第一个独属于中国传统文化的胜利

GPTs 发布已经快两个月了,很有可能成为下一阶段的 app 形态,现在已经有很多人在开发、使用 GPTs,最近官方数据也更新了使用量最多的 GPT,来看下中文榜单的 Top10: 排名标题创建者使用量1AI 算命Jerrold Bergnaum12100…

【智能家电】东胜物联离在线语音方案为厨电企业赋能,实现厨房智能化控制

近年来,我国厨电市场蓬勃发展。据行业统计数据显示,至今年6月,市场规模已达356亿元,同比增长8.8%。随着数字科技、物联网和人工智能的兴起,厨电产品正在朝着更智能、多功能化的方向迅速发展。 为此厨电厂商正在积极布…

开放原子线下训练营---STM32H7搭载TobudOS开发心得

导语: 本次线下活动是以STM32H7为核心的一个功能强大的开发板,不仅支持Audio,HDMI,还支持4G或者WiFi模块,也可以外接屏幕,本次线下训练营是以4G模块进行开发。 线下的实物开发板如下所示: 注意…