什么是Redis数据一致性?如何解决?
在系统中缓存最常用的策略是:服务端需要同时维护DB和cache,并且是以DB的结果为准–Cache-Aside Pattern(缓存分离模式、旁路缓存)
读数据

单纯的读数据是不会产生数据不一致,只有并发下读和写才会存在数据不一致。
写数据
- 先更新缓存再更新数据库
- 先删除缓存再更新数据库
- 先更新数据库再更新缓存
- 先更新数据库再删除缓存
以上操作步骤总结下来就是两点:
- 更新缓存还是删除缓存?
- 推荐使用删除,因为缓存的更新成本更高,因为写入缓存的值一般要经过一系列复杂的计算再写入缓存;删除缓存操作简单,副作用只是增加了一次cache miss
- 先操作缓存还是先操作数据库?
数据不一致
先操作缓存

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

通过延迟双删的策略可以解决,且保证了最终一致性。虽然线程2依然拿到的是老数据,但是后面的线程拿到的都是新数据。
最终一致性:最终能够保证redis和DB的一致性。
强一致性:redis操作和DB操作设置成原子操作,虽然保证了一致性但是降低了吞吐量,违背了使用redis的初衷。
先操作数据库

通过先操作数据库,然后操作缓存,虽然线程2在删除之前拿到的是老数据(脏数据),但是可以保证最终一致性,推荐使用该方式。
删除重试
上述两种方式不管是延迟双删还是先操作数据库,保证最终一致性的前提是删除缓存成功,如果在极端条件下删除缓存失败怎么办?

如上图所示,通过向MQ发送异步消息,通知客户端进行重试删除来解决。引入canal组件,可将该删除重试功能从业务代码中解耦,canal客户端可以使用springboot应用来实现。
相关文章:
什么是Redis数据一致性?如何解决?
在系统中缓存最常用的策略是:服务端需要同时维护DB和cache,并且是以DB的结果为准–Cache-Aside Pattern(缓存分离模式、旁路缓存) 读数据 单纯的读数据是不会产生数据不一致,只有并发下读和写才会存在数据不一致。 写…...
【办公软件】开发常用网站
文章目录 一、开发社区二、开发学习三、视图工具四、开发工具五、前端web开发工具六、开发接口官网 备用产看。 https://www.webhub123.com https://www.webhub123.com/#/home/detail?projectHashid59183272&ownerUserid22053727 java全栈只是体系:https://www…...
车道线检测_Canny算子边缘检测_1
Canny算子边缘检测(原理) Canny算子边缘检测是一种经典的图像处理算法,由John F. Canny于1986年提出,用于精确、可靠地检测数字图像中的边缘特征。该算法设计时考虑了三个关键目标:低错误率(即尽可能多地检…...
kubadm部署kubernetes
什么是kubernetes Kubernetes是一款应用于集群的,容器自动部署、扩展和管理的开源平台,提供了一种以容器为中心的基础架构。利用kubernetes,你可以快速高效地响应客户如下请求: 应用程序的动态、精准部署应用程序的动态扩展无缝推…...
Sqlite插入单引号和双引号,防止sql注入
1. 方法1 sqlite3_mprintf替换sprintf,%q替换%s. 1.1. 举例 修改前代码 //修改前, hello123写入失败char sql[1000]char* sql sprintf("UPDATE table SET name %s WHERE name_id %d","hello123", 1);rc sqlite3_exec(db, sql, NULL, NULL, &err…...
代码随想录算法训练营第二十九天(回溯5)|491. 非递减子序列、46. 全排列、47. 全排列 II(JAVA)
文章目录 491. 非递减子序列解题思路源码 46. 全排列解题思路源码 47. 全排列 II解题思路源码 总结 491. 非递减子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 …...
【CANN训练营笔记】AscendCL图片分类应用(C++实现)
样例介绍 基于PyTorch框架的ResNet50模型,对*.jpg图片分类,输出各图片所属分类的编号、名称。 环境介绍 华为云AI1s CPU:Intel Xeon Gold 6278C CPU 2.60GHz 内存:8G NPU:Ascend 310 环境准备 下载驱动 wget ht…...
从头开发一个RISC-V的操作系统(二)RISC-V 指令集架构介绍
文章目录 前提ISA的基本介绍ISA是什么CISC vs RISCISA的宽度 RISC-V指令集RISC-V ISA的命名规范模块化的ISA通用寄存器Hart特权级别内存管理与保护异常和中断 目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提…...
uniapp/设置桌面角标/发送系统通知/动态修改桌面应用图标/展示3d模型/仿淘宝二楼
uniapp的安卓apk图标角标设置消息数量 1、主要方法: 设置角标: plus.runtime.setBadgeNumber(999) 清除角标: //plus.runtime.setBadgeNumber(0)//没有效果 plus.runtime.setBadgeNumber(-1) //有效果 2、使用在具体的生命周期 1、打开app获取…...
【Java八股学习】Redis高可用 思维导图
说明 文章内容通过学习小林Coding内的优质文章后整理而来,整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除,再次对小林Coding内的优质文章表示感谢。参考文章如下: 主从复制是怎么实现的?为什么要有哨…...
C++万物起源:类与对象(三)拷贝构造、赋值重载
目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中,我们可以将一个变量赋值给…...
JavaScript构造函数(new构造js对象与原型链prototype)
构造函数详解 铺垫:面向对象编程一、构造函数是什么?二、构造函数的作用?三、构造函数的执行过程?四、构造函数的返回值?五、构造函数为什么要用new关键字调用?六、构造函数的实例成员和静态成员࿱…...
【WPF应用31】WPF基本控件-ListView的详解与示例
WPF(Windows Presentation Foundation)是.NET框架的一个组成部分,它用于构建桌面应用程序的用户界面。ListView是WPF中一个非常强大的数据展示控件,它可以用来显示一系列的项,类似于Windows资源管理器中的文件列表。Li…...
【动态】江西省小型水库安全监测能力提升试点项目通过验收
近日,由北京国信华源科技有限公司和长江勘测规划设计研究有限责任公司联合承建的江西省小型水库安全监测能力提升试点项目圆满通过验收。 在项目业主单位的组织下,省项目部、特邀专家、县水利局二级项目部以及项目设计、监理、承建等单位的代表组成验收工…...
前视声呐目标识别定位(九)-声呐驱动
前视声呐目标识别定位(一)-基础知识 前视声呐目标识别定位(二)-目标识别定位模块 前视声呐目标识别定位(三)-部署至机器人 前视声呐目标识别定位(四)-代码解析之启动识别模块 …...
【详解】Windows系统安装Nginx及简单使用
【详解】Windows系统安装Nginx及简单使用 一、Nginx是什么? “Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡。”Nginx 是一款 http 服…...
WebGPU vs. WebGL:前端图形技术的进化与数字孪生的崭新前景
在现代互联网时代,图形渲染在网页应用和数字孪生的开发中起着至关重要的作用。WebGL和WebGPU是两种前端图形技术,它们在处理图形和计算密集型任务时发挥着关键作用。本文将深入研究这两种技术,探讨它们的区别、WebGPU的优势,以及它…...
即刻体验 | 使用 Flutter 3.19 更高效地开发
我们已隆重推出全新的 Flutter 版本——Flutter 3.19。此版本引入了专为 Gemini 设计的新 Dart SDK、一个能让开发者对 Widget 动画实现精细化控制的全新 Widget,Impeller 更新带来的渲染性能提升、有助于实现深层链接的工具和对 Windows Arm64 的支持,以…...
Exchanger 怎么用J.U.C
Exchanger简介 Exchanger通常用来解决以下类似场景的问题,如下:两个线程间需要交换数据的问题,在多线程编程中,经常会有这样的场景:两个线程各自持有一些数据,并且需要在某个点上交换这些数据,…...
校园局域网钓鱼实例
Hello ! 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全,设计的钓鱼案例也是怎么简陋怎么来 注:本文不会外传代码,后端已停止使用,仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…...
别再用filter了!MATLAB bandpass函数一键搞定信号滤波,附音乐合成与降噪实战
别再用filter了!MATLAB bandpass函数一键搞定信号滤波,附音乐合成与降噪实战 信号处理工程师的日常,往往伴随着无数个深夜调试滤波器的痛苦回忆。从设计滤波器系数到手动补偿群延迟,再到反复调整截止频率,传统filter和…...
别急着格式化!系统崩溃进不去,用这招在Win10恢复环境里解锁BitLocker加密盘
系统崩溃后抢救BitLocker加密数据的终极指南 当Windows系统突然崩溃无法启动,而你的重要数据又存放在BitLocker加密的磁盘中时,那种焦虑感是难以言喻的。很多人第一反应是重装系统或格式化硬盘,但这往往会导致永久性数据丢失。本文将带你深入…...
AI应用框架Weam:微服务化架构与工作流编排实战
1. 项目概述:一个面向未来的AI应用框架 最近在AI应用开发领域,一个名为“Weam”的项目开始引起不少开发者的注意。它不是一个具体的AI模型,而是一个旨在构建、管理和部署AI应用的开源框架。简单来说,你可以把它想象成一个“AI应用…...
CANN/ops-nn RMS归一化动态量化算子
AddRmsNormDynamicQuantV2 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推…...
2026.5.11:2026年5月TIOBE指数
2026年5月TIOBE指数 2026年5月TIOBE指数 五月头条:统计编程语言市场正在经历重大整合 本月,R 编程语言在 TIOBE 指数中再次攀升至第八位,追平了历史最高排名。这并非偶然。统计编程语言市场显然正在经历一场重大整合。Python 和 R 成为最大的赢家,而许多老牌语言则持续失去…...
LumenPnP真空系统架构:双喷嘴拾放技术深度解析
LumenPnP真空系统架构:双喷嘴拾放技术深度解析 【免费下载链接】lumenpnp The LumenPnP is an open source pick and place machine. 项目地址: https://gitcode.com/gh_mirrors/lu/lumenpnp LumenPnP作为一款开源桌面贴片机,其真空系统是实现精准…...
到极限了吗?优化算法APP9.0,再加入228个车间调度案例!
我又来更新啦!这次在优化算法APP8.0的基础上再次大更新!加入了4大经典车间调度数据集,共228个实例开箱即用。这个案例的加入非常适合写论文哦!当你以为我黔驴技穷的时候,不好意思,我的表演才刚刚开始~ 哈哈…...
抖音视频无水印下载:3分钟快速上手免费工具完整指南
抖音视频无水印下载:3分钟快速上手免费工具完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...
告别高价限流流量腰斩,凌风工具箱为 Temu 商品流量兜底
2026 年 Temu 平台比价管控逻辑已进入新阶段,但高价限流(前端屏蔽)仍为常态化风险。卖家若仍靠手动逐件处理限流预警,极易错过流量挽回窗口。凌风工具箱基于 Temu 官方 API 接口开发,打造批量处理高价限流专属模块&…...
微信网页版终极解决方案:三步实现浏览器端微信完整使用指南
微信网页版终极解决方案:三步实现浏览器端微信完整使用指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为繁琐的微信安装流程而烦…...
