当前位置: 首页 > news >正文

什么是Redis数据一致性?如何解决?

在系统中缓存最常用的策略是:服务端需要同时维护DB和cache,并且是以DB的结果为准–Cache-Aside Pattern(缓存分离模式、旁路缓存)

读数据

在这里插入图片描述

单纯的读数据是不会产生数据不一致,只有并发下读和写才会存在数据不一致。

写数据

  1. 更新缓存再更新数据库
  2. 删除缓存再更新数据库
  3. 更新数据库再更新缓存
  4. 更新数据库再删除缓存

以上操作步骤总结下来就是两点:

  • 更新缓存还是删除缓存?
    • 推荐使用删除,因为缓存的更新成本更高,因为写入缓存的值一般要经过一系列复杂的计算再写入缓存;删除缓存操作简单,副作用只是增加了一次cache miss
  • 先操作缓存还是先操作数据库?

数据不一致

先操作缓存

image

经过上述过程之后,出现了数据不一致;redis中是老的数据,而DB中是新的数据(写延迟);所有后续其他的线程都是从缓冲中拿到的老数据,直至该老数据缓存过期。

如何解决这种情况下的数据不一致性?
image

通过延迟双删的策略可以解决,且保证了最终一致性。虽然线程2依然拿到的是老数据,但是后面的线程拿到的都是新数据。

最终一致性:最终能够保证redis和DB的一致性。
强一致性:redis操作和DB操作设置成原子操作,虽然保证了一致性但是降低了吞吐量,违背了使用redis的初衷。

先操作数据库

image

通过先操作数据库,然后操作缓存,虽然线程2在删除之前拿到的是老数据(脏数据),但是可以保证最终一致性,推荐使用该方式

删除重试

上述两种方式不管是延迟双删还是先操作数据库,保证最终一致性的前提是删除缓存成功,如果在极端条件下删除缓存失败怎么办?
在这里插入图片描述

如上图所示,通过向MQ发送异步消息,通知客户端进行重试删除来解决。引入canal组件,可将该删除重试功能从业务代码中解耦,canal客户端可以使用springboot应用来实现。

http://www.lryc.cn/news/331507.html

相关文章:

  • 【办公软件】开发常用网站
  • 车道线检测_Canny算子边缘检测_1
  • kubadm部署kubernetes
  • Sqlite插入单引号和双引号,防止sql注入
  • 代码随想录算法训练营第二十九天(回溯5)|491. 非递减子序列、46. 全排列、47. 全排列 II(JAVA)
  • 【CANN训练营笔记】AscendCL图片分类应用(C++实现)
  • 从头开发一个RISC-V的操作系统(二)RISC-V 指令集架构介绍
  • uniapp/设置桌面角标/发送系统通知/动态修改桌面应用图标/展示3d模型/仿淘宝二楼
  • 【Java八股学习】Redis高可用 思维导图
  • C++万物起源:类与对象(三)拷贝构造、赋值重载
  • JavaScript构造函数(new构造js对象与原型链prototype)
  • 【WPF应用31】WPF基本控件-ListView的详解与示例
  • 【动态】江西省小型水库安全监测能力提升试点项目通过验收
  • 前视声呐目标识别定位(九)-声呐驱动
  • 【详解】Windows系统安装Nginx及简单使用
  • WebGPU vs. WebGL:前端图形技术的进化与数字孪生的崭新前景
  • 即刻体验 | 使用 Flutter 3.19 更高效地开发
  • Exchanger 怎么用J.U.C
  • 校园局域网钓鱼实例
  • 网络原理 - HTTP / HTTPS(3)——http响应
  • Flask Python:模糊查询filter和filter_by,数据库多条件查询
  • leetcode 热题 100(部分)C/C++
  • 梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码
  • 如何通过Spring提供的EL表达式执行bean的属性或方法?
  • SSTI 服务器端模板注入(Server-Side Template Injection)
  • Vue.js---------Vue基础
  • 力扣经典150题第一题:合并两个有序数组
  • Git:日志修改
  • 【数据库】MySQL InnoDB存储引擎详解 - 读书笔记
  • GPT-2原理-Language Models are Unsupervised Multitask Learners