如何保证 Redis 缓存和数据库的一致性?

如何保证 Redis 缓存和数据库的一致性?

1. 问题出现场景

  1. 先修改数据库,再删除缓存

    删除数据库数据成功了,但是删除缓存却失败了,缓存中仍保留的是旧数据

  2. 先删除缓存,再删除数据库

    如果 Redis 缓存删除成功后,假如数据库数据还没来得及更新,用户又请求数据,这时就会从数据库中读取旧的值,存入到 Redis 中,用户查到的数据依旧是旧的数据。

2. 解决方案

2.1 双写事务

原理:利用 Redis 的事务特性,或是数据库的事务特性,把 Redis 操作和数据库操作放到同一个事务中去执行,同时提交或回滚,最大程度上保证 Redis 缓存和数据库的一致。

  1. 优点:实现简单、不复杂,能够保证一定的一致性

  2. 缺点:

    Redis 和数据库本质不是同一种数据库,所以无法通过事务来保证它们之间完全的一致性

适合小型系统的简单读写,不适合高并发系统。

2.2 延迟双删

原理:当完成数据库的更新时,立即删除 Redis 缓存,为了确保数据更新的稳妥,延迟一定时间后(例如 1s、2s),再次对缓存进行删除。

目的:避免并发操作导致缓存脏数据的问题出现

  1. 优点:实现简单,能够解决大部分场景下短时间数据不一致的情况
  2. 缺点:延迟时间非常难以精确控制,如果操作量比较大,可能还会出现覆盖的风险

2.3 订阅更新机制

原理:当数据库更新,会向消息队列发送一条消息,Redis 通过订阅这个消息队列,来更新缓存数据,这样会让更新和缓存的清除变得非常及时。

  1. 优点:同步效果非常好
  2. 缺点:系统的复杂度会增加,消息队列本身需要一些可靠性,也是需要一些维护成本

2.4 读写分离架构

高并发场景应用非常广泛

原理:把写操作全部直接操作数据库,然后通过一个异步线程、后台服务、定时任务,去更新 Redis 缓存,从而实现数据的一致性。

  1. 优点:缓存压力降低很多,特别适合大数据流量的系统
  2. 缺点:项目开发比较复杂,因为要做好这种异步的逻辑的处理

2.5 Canal 订阅 Binlog 同步 Redis

原理:修改数据库的同时,数据库的操作会同时写入到 Binlog 中,这时可以通过 Canal 中间键,来订阅 Binlog 的一些变化,如果监听到数据库变化之后,把更新的数据同步通知给 Redis,来更新 Redis 的缓存

3. 总结

3.1 哪儿种方案更好?

具体选择哪儿种解决方案,要根据具体业务场景、项目的需求,以及整体的架构等多种因素去综合考虑,比如是否是高并发、是否要考虑低延迟等等因素。

脱离业务谈技术,就是耍流氓。

3.2 归纳

虽然这几种解决方案,可以在一定程度上解决 Redis 和数据库不一致的情况,但是在实际情况种,还要结合业务,来判断项目中是否真的需要,或是项目中可以使用 Redis。如果业务需要强一致性,例如银行、股票等业务,其实不使用 Redis 其实也是一种很好的方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…

网络原理--TCP/IP(2)

我们在之前已经介绍到TCP协议的核心机制二,接下来我们将继续介绍其他的核心机制。 核心机制三:连接管理 即建立连接,断开连接,在正常情况下,TCP要经过三次握⼿建⽴连接,四次挥⼿断开连接。 建立连接:TCP是通过“三次握手” 在生活中的握手就是打招呼,,但握手操作没有…

Windows PicPick Professional-v7.3.2-中文版

Windows PicPick Professional-中文版 链接:https://pan.xunlei.com/s/VOKGwGVGWUDl7L8cW4D1A1W4A1?pwdw5qz# - 更新了中文翻译,默认取消检测升级,删除多国语言

校园二手交易微信小程序的设计与实现(论文源码调试讲解)

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…

数据结构之各类排序算法代码及其详解

1. 排序的概念 排序是一种常见的算法概念,用于将一组数据按照特定的顺序进行排列。排序算法的目的是将一组数据按照递增或递减的顺序重新排列。常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。排序算法的选择通常取决于数据规模、数据分布…

6.6.6 嵌入式SQL

文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是:如何识别嵌入语句?如何让主语言(比如C,C语言)和SQL通信? 识别SQL语句 为了识别主语言中嵌入的SQL…

keil主题(vscode风格)

#修改global.prop文件,重新打开keil即可 # Keil uVision Global Properties File # This file is used to customize the appearance of the editor# Editor Font editor.font.nameConsolas editor.font.size10 editor.font.style0# Editor Colors editor.backgro…

医疗AR眼镜:FPC如何赋能科技医疗的未来之眼?【新立电子】

随着科技的飞速发展,增强现实(AR)技术在医疗领域的应用逐渐成为焦点。医疗AR眼镜作为一种前沿的智能设备,正在为医疗行业带来深刻的变革。它不仅能够提升医生的工作效率,还能改善患者的就医体验,成为医疗科…

【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言依赖Flask构建本地网页访问LM Studio 开启网址访问DeepSeek 调用模板Flask 访问本…

GPIO(嵌入式学习)

GPIO 通用输入输出口: 可分为八种输入输出模式 输出模式 下端可控制端口输出高低电平,用以驱动LED,控制蜂鸣器,模拟通信协议输出时序 输入模式 读取高低电平或电压,用与读取按键输入,外界模块电平信号…

AI助理精准匹配------助力快速搭建Stable Difussion图像生成应用

AI助理精准匹配------助力快速搭建Stable Difussion图像生成应用 背景信息搭建Stable Difussion图像生成应用释放资源 背景信息 过去你在阿里云社区搭建Stable Difussion图像生成应用,你可能还需要去在线实验室或者是官方文档去查找部署步骤,找到部署步…

火山引擎 DeepSeek R1 API 使用小白教程

一、火山引擎 DeepSeek R1 API 申请 首先需要三个要素: 1)API Key 2)API 地址 3)模型ID 1、首先打开火山引擎的 DeepSeek R1 模型页面 地址:账号登录-火山引擎 2、在页面右下角,找到【推理】按钮&#…

排序算法(3):

这是我们的最后一篇排序算法了,也是我们的初阶数据结构的最后一篇了。 我们来看,我们之前已经讲完了插入排序,选择排序,交换排序,我们还剩下最后一个归并排序,我们今天就讲解归并排序,另外我们还…

【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 📚欢迎订阅专栏…

微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果

一、效果图 1、主页面 根据物品信息进行菜单分类,点击单项购物车图标添加至购物车,记录总购物车数量 2、购物车详情页 根据主页面选择的项,根据后台查询展示到页面,可进行多选,数量加减等 二、代码 1、主页面 页…

51c自动驾驶~合集52

我自己的原文哦~ https://blog.51cto.com/whaosoft/13383340 #世界模型如何推演未来的千万种可能 驾驶世界模型(DWM),专注于预测驾驶过程中的场景演变,已经成为追求自动驾驶的一种有前景的范式。这些方法使自动驾驶系统能够更…

[AI机器人] Web-AI-Robot机器人前瞻版--比奇堡海之霸凯伦

文章目录 简述开源Web-AI-Robot 项目-比奇堡-海之霸-凯伦 技术架构效果预览 简述 本项目配合前端项目bikini_bottom_karen_ui运行,来源于柒杉工作室(截止2025.2,目前我自己)。 打造一个只需要在浏览器上运行的AI智能机器人&#…

vue写一个登录页面

目录 一、安装ui库二、路由跳转三、页面 一、安装ui库 element plus库 Element Plus 是 Element UI 的升级版本,专为 Vue 3.x 设计。它继承了 Element UI 的优秀特性,同时针对 Vue 3 的新特性(如 Composition API、Teleport 等)进…

Linux笔记---缓冲区

1. 什么是缓冲区 在计算机系统中,缓冲区(Buffer) 是一种临时存储数据的区域,主要用于协调不同速度或不同时序的组件之间的数据传输,以提高效率并减少资源冲突。它是系统设计中的重要概念,尤其在I/O操作、网…

问题修复-后端返给前端的时间展示错误

问题现象: 后端给前端返回的时间展示有问题。 需要按照yyyy-MM-dd HH:mm:ss 的形式展示 两种办法: 第一种 在实体类的属性上添加JsonFormat注解 第二种(建议使用) 扩展mvc框架中的消息转换器 代码: 因为配置类继…