Redis如何保证数据一致性?

devtools/2024/9/23 6:17:54/

Redis如何保证数据一致性?

Redis通常作为持久层数据库(例如MySQL)的缓存层,如果缓存或者数据库数据发生改变,如何保证双方的数据是一致的?

在这里插入图片描述

这其实是要分情况讨论滴,对数据一致性不同的要求有不同的解决方案,主要分为一致性要求高的(最终一致性、绝对一致性),一致性要求低的

数据一致性要求高

Cache Aside Pattern旁路缓存策略

双写一致性:当修改了数据库的数据也同时更新缓存的数据,缓存和数据库的数据保持一致

  1. 当数据提交更新时,先删除缓存,再更新数据库
  2. 当数据提高更新时,先更新数据库,再删除缓存

但是这两种方案都存在脏数据的风险

先删除缓存,再更新数据库,假如在线程1更新数据库的期间,有其他的线程访问数据,那么所有的线程都会去访问到数据库,并且拿到的是旧数据,放入到缓存中

在这里插入图片描述

先更新数据库,再删除缓存,假如在线程1查询数据库的期间,其他线程对数据库进行了修改,并且删除了缓存,在线程1查询完数据过后将旧的数据写入到了缓存中

在这里插入图片描述

总而言之,无论先删除缓存还是先更新数据库都会存在数据不一致的问题,但是先更新数据库再删除缓存产生数据不一致的概率比较低,因为写入缓存的速度一般是远远快于更新数据库的操作,并且如果数据库更新失败,先删缓存,缓存不会回滚,而后删缓存,数据库更新失败,缓存不会被删除

延迟双删

延迟双删,在写库完成后,删除缓存,写库的线程睡眠一段时间再次删除缓存

在这里插入图片描述

为什么要使用延迟双删?其实就是考虑到上图中的极端情况,一个读线程发现缓存中没有对应的数据,去查库,在查询完毕准备更新缓存期间,另一个写线程完成了写库以及对缓存的删除此时数据库中的数据是新数据,而读线程将缓存更新为旧数据),一般情况下,这种事件的发生概率很低,但是使用延迟双删可以规避掉这种问题,进一步提高数据的一致性,但缺点就是性能会有所下降

那具体的超时时间要根据你具体的业务来定,一般设置几秒足够了

如何避免删除缓存失败的情况?

MQ方案

在这里插入图片描述

可以使用一个MQ队列接受删除失败的key,使用一个消费者监听MQ队列,一旦有删除Redis失败的消息,就去进行删除重试

监听binlog日志

在这里插入图片描述

阿里巴巴有一个专门的中间件,负责监听binlog日志,一旦binlog发生了变动,cannel就会通知cannel的客户端,cannel客户端负责进行缓存的删除操作(同时支持重试)

总结:这两种方案核心就是将删除缓存的操作异步化了,并且支持重试

难道没有保证数据绝对一致性的方案吗?读写锁

读写锁(数据绝对一致性)

读写锁:给读操作加读锁,给写操作加写锁,读锁允许其他线程进行读操作但是不能进行写操作写锁不允许其他线程进行读、写操作

例如下面这个栗子

当线程对数据进行读操作,其他所有对数据进行写操作的线程都将被阻塞,但是可以进行读操作

在这里插入图片描述

当线程对数据进行写操作时,其他所有对数据进行读写操作的线程都将被阻塞

在这里插入图片描述

优点:读写锁保证了数据库与缓存之间的数据强一致性

缺点:加上读写锁之后,访问数据的速度将变得缓慢,有点违背了加缓存的初衷,所以,但你的数据是写多于读的,不建议放入缓存中

数据一致性要求低

系统对于数据的实时一致性要求没那么高,例如视频播放量、点赞数、社交媒体动态

怎么解决?

  1. 异步更新策略:使用MQ作为消息中间件,更新缓存后,通知缓存删除
  2. 缓存失效策略:设置合适的缓存失效时间,让缓存在一定时间内保持一致性,在超时后从数据库获取新数据即可

总结

对于数据一致性高的场景,旁路缓存中先更新数据库再删缓存已经能保证绝大情况下的数据一致性,如果要求再高点可以考虑上延迟双删,同时加中间件避免缓存删除失败。不推荐上读写锁,因为缓存本身就是为了提高性能的,读写锁对性能的影响较大。


http://www.ppmy.cn/devtools/40099.html

相关文章

STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位

STM32开发学习——使用 Cortex-M3/M4/M7 故障异常原因与定位 文章目录 STM32开发学习——使用 Cortex-M3/M4/M7 故障异常原因与定位文档说明:官方参考文档线上链接(可在线阅读与下载):故障异常处理程序HardFault优先级升级说明故障…

什么是股指期货风险度?

期货风险度就像是你账户的“健康指标”,它告诉我们你用了多少资金来持有期货合约,以及你账户里还剩下多少“备用金”。风险度越高,意味着你的“备用金”越少,如果市场突然变化,你可能需要迅速补充资金。 股指期货风险…

WHAT - CSS Animationtion 动画系列(四)- 移动端全屏动画

目录 一、背景1.1 GIF & Video1.2 存在的问题 二、技术方案2.1 使用CSS动画和JavaScript2.2 使用JavaScript库2.3 使用序列帧1. css animation 帧动画2. JavaScript requestAnimationFrame 帧动画 2.4 使用Canvas1. html 和 canvas 中的 video2. 基于Canvas的动画库 今天我…

YOLOv8训练流程-原理解析[目标检测理论篇]

关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了,为了更好地学习本章内容,建议先去看预测流程的原理分析YOLOv8原理解析[目标检测理论篇]-CSDN博客,再次把YOLOv8网络结构图放在这里,方便随时查看。 ​ 1.前言 YOLOv8训练…

ssrf初步

一,简介 全称:Server-Side Request Forgery(中文:服务器端请求伪造) 攻击者从服务端发起请求,让服务器连接任意外部系统,从而泄露敏感数据。主要利用各种协议的请求伪造,例如php协…

【神经网络】输出层的设计

文章目录 前言一、恒等函数和softmax函数恒等函数softmax 函数python实现softmax函数 二、实现softmax函数时的注意事项函数优化python实现 三、softmax函数的特征计算神经网络的输出输出层的softmax函数可以省略“学习”和“推理”阶段 四、输出层的神经元数量 前言 神经网络…

JVM认识之垃圾收集算法

一、标记-清除算法 1、定义 标记-清除算法是最基础的垃圾收集算法。它分为标记和清除两个阶段。先标记出所有需要回收的对象(即垃圾),在标记完成后再统一回收所有垃圾对象。 2、优点和缺点 优点:实现简单缺点: 可能…

静态代理IP是否支持HTTP和HTTPS?

静态代理IP通常是在服务器上进行配置的,可以支持HTTP和HTTPS协议。无论是使用HTTP还是HTTPS,静态代理IP都可以通过配置服务器的代理设置来实现对网络请求的转发和代理。 静态代理IP支持哪些协议 静态代理IP支持的协议包括但不限于HTTP、HTTPS、FTP、So…