Redis - 缓存的双写一致性

news2024/9/23 1:37:16

概念: 当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致

那为什么会有不一致的情况呢?

如果不追求一致性,正常有两种做法

  1. 先修改数据库 后删除旧的缓存
  2. 先删除旧的缓存 再修改数据库

我们以先删除旧的缓存,再修改数据库为例:

  1. 当 线程1 要对数据库做更新操作的时候,先将Redis中旧的缓存删掉
  2. 不巧此时线程之间发生切换,线程2读取缓存,因为被线程1删掉了,所以缓存未命中
  3. 线程2就直接查询数据库,并重建缓存(将此时的数据库数据写回Redis)
  4. 接着又切换回线程1,线程1将数据库中的数据修改为新的值

此时就出现了数据库和缓存中的数据不一致的问题

因此我们不能只进行一次缓存删除操作,要使用双删的方法

  1. 比如先删除旧的缓存,修改完数据库后,再删除一次缓存

但是单纯双删不能解决问题,比如

  1. 当 线程1 要对数据库做更新操作的时候,先将Redis中旧的缓存删掉
  2. 不巧此时线程之间发生切换,线程2读取缓存,因为被线程1删掉了,所以缓存未命中
  3. 线程2就直接查询数据库,获取当前数据库的值,但未重建缓存
  4. 接着又切换回线程1,线程1将数据库中的数据修改为新的值,并再次删除缓存
  5. 此时又切换为线程2,线程2将当时读取到的值写回Redis,又造成了数据不一致

因此我们可以采取 延迟双删策略

还是上面那个例子:

  1. 当 线程1 要对数据库做更新操作的时候,先将Redis中旧的缓存删掉
  2. 不巧此时线程之间发生切换,线程2读取缓存,因为被线程1删掉了,所以缓存未命中
  3. 线程2就直接查询数据库,获取当前数据库的值,但未重建缓存
  4. 接着又切换回线程1,线程1将数据库中的数据修改为新的值,但不马上删除缓存,而是等待一段时间
  5. 切换为线程2,线程2将当时读取到的值写回Redis
  6. 最后切换回线程1,线程1再将Redis中的数据删除

可以看到 延迟双删策略 确实能解决数据一致性的问题,但延迟的时间很难确定,短了怕上面的例子中,第6步先于第5步执行,长了怕在第5步和第6步之间的数据不一致状态持续时间太长

因此我们需要另外的解决方案

针对双写一致性有两种场景: 一致性要求高允许短暂不一致

这两种场景的解决方案不同

一致性要求高

可以使用如下的分布式锁方案

在这里插入图片描述

但是我们可以看到该方案让并发变为了串行,极大降低了性能

因此我们可以使用读写锁

读锁 readLock: 加了读锁之后,其他线程还能继续加读锁和读数据,但是不能写,也不能加写锁

写锁 writeLock:写锁是排他锁,加锁之后,其他线程阻塞,不能进行读写操作

Redission 以及实现了读写锁

代码实例

读锁

在这里插入图片描述

写锁

在这里插入图片描述

其中 redissonClient.getReadWriteLock()中传入的值必须是一样的

允许短暂不一致

实际上的开发过程中,这种场景才是主流

这种场景的解决方法很多,比较常用的方法是 异步通知保持数据的最终一致性

流程图如下:

在这里插入图片描述

修改数据库时,需要发送修改记录给MQ,缓存服务需要监听MQ,根据MQ中的修改记录更新缓存

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

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

相关文章

「教程」如何使用一套代码在多种程序中接入天气预警API

引言 天气预警的重要性不言而喻,在遭受自然灾害和极端天气时,及时获得预警信息可以拯救生命和减少财产损失。如今,随着科技的进步,开发者和企业可以借助天气预警 API 这款强大的服务,将实时预警信息集成到自己的应用中…

深刻理解python特性-列表推导式和生成器表达式

哈喽大家好,今天给大家介绍两个Python中特性-列表推导式和生成器表达式 今天我想向你介绍python语言的两个非常有用的特性:列表推导式和生成器表达式。这两个特性都可以让你用一行简洁的代码来创建一个序列,而不需要写循环或者函数。但是它们…

十年测试经验告诉你单元测试到底测什么

今天的前端夜点心我们来聊聊在项目中单元测试应该测些什么? 以国内互联网的开发节奏,在前端业务项目中全面覆盖单元测试有时显得不太可行,主要是因为以下这些绊脚石: UI 交互复杂,路径难以覆盖全面 工期紧&#xf…

HCIA云计算 V5.0题库

云计算,这是近几年听得最多词了,云计算对于网络的发展帮助非常大,它自身所产生的价值是不可估量的!所以云计算的岗位对于很多IT公司来说,都是有一定地位的。华为认证云计算面向的对象很简单就是对云计算技术感兴趣的人…

明道云与美洽产品生态合作介绍

背景介绍 近来,B2B企业用人及获客成本居高不下的问题愈发显现,企业为提高核心竞争力,利用信息技术协调企业与客户在销售、营销和服务上的交互,在优化管理方式的同时,向客户提供个性化交互服务,以达到吸引新…

DID以及社交网络中的ZKP

1. 引言 本文关键术语为: Decentralized Identity (DID,去中心化身份) or self-sovereign identity (SSI,自治身份) :是一个基于开放标准的框架,使用自主、独立的标识符和可验证证书,实现可信的数据交换。…

秋叶整合包如何安装Python包

前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章,有同学运行时遇到缺少Python Module的问题,帮助他处理了一下,今天把这个经验分享给大家,希望能帮助到更多的同学。 有时候启动某些插件的时候会出现 Mo…

《Cesium 基础知识点》- 监听鼠标事件

Cesium.ScreenSpaceEventHandler 处理用户输入事件。可以添加自定义功能,以便在用户输入时执行。初始化: const handler new Cesium.ScreenSpaceEventHandler(viewer.canvas); 添加事件监听 使用方法 setInputAction 例如 handler.setInputAction(o…

数据分级分类工具

数据安全现状 当前数据安全形势严峻,数据泄露、丢失、被篡改等问题层出不穷。企业需要采取一系列措施,包括加强数据加密、完善数据备份、加强网络安全防护、加强员工培训等。政府也需要加强对数据安全的监管和管理,制定相关法律法规&#xf…

程序员在今年这种行情下如何快速找到合适的工作?

前面好几篇文章都在写面试的感悟,带大家了解了目前的一些市场行情,以及面试过程中招聘方与求职者看待面试的不同视角。 今天这篇文章写一些对大家求职面试可能更有用的几条建议: 第一,值与量的权衡 在早些年,大多数…

利用Python 实现 模拟退火算法

模拟退火算法 模拟退火算法流程图 初始温度 新温度值 进入循环 生成新的解 按照 bound按照 constraint 计算新解与当前解的目标差异判断是否接受解判断是否更新解循环结束按照温度降低率降低温度温度小于最低温度输出结果 模拟退火算法示例代码1 import numpy as npdef objec…

【ESP32】调试IIC功能

1.创建示例项目i2c_simple:VSCODE中->“查看”->”命令面板“->输入:Show Examples projects->选择Use current ESP-IDF(C:\Espressif\frameworks\esp-idf-v5.1)->弹出示例ESP-IDF Examples,选择peripherals->i2c->i2c_…

<findbugs>静态代码分析工具

背景: IDEA安装的findbug插件目前无法和jenkins的扫描结果保持一致,因为:没有对应jenkins上findbug的版本; 原理: 将jenkins服务器上的findbugs插件,拷贝到本地,修改build.xml内容以匹配目录…

代码随想录算法训练营第五天| 242. 有效的字母异位词,349. 两个数组的交集,202快乐数,1. 两数之和

哈希表 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断…

cypress 教程

cypress 教程 cypress是一个用于Web应用程序的端到端测试框架。它是一个开源的js测试工具,设计的目的是Web应用程序的测试能更快速、简单和可靠。赛普斯允许开发人员编写模拟用户交互和验证应用程序行为的自动测试。 我们可以使用js或者ts来开发,但是j…

用牛鲨水豚赚取SUI的机会又来喽,500万SUI奖励等你来领!

刚刚结束的第一轮Bullshark Quest真是一次惊心动魄的体验!我们非常感激社区成员的积极参与以及对Sui生态系统的关注。此轮获奖者的奖励已于美国时间2023年7月28日,在Quest门户网站上公布。参与者点击“Claim”即可将奖励领取至Sui钱包。请注意&#xff0…

猿创征文|弃文从工,从小白到蚂蚁工程师,我的 Java 成长之路

一、前言 1.1 背景 最近 CSDN 开展了猿创征文,希望博主写文章讲述自己在某个领域的技术成长历程。 之前也曾想找个机会写篇文章,记录下自己的成长历程。 因此,借着这个机会写下这篇文章。 在回顾自己的成长历程的同时,希望对一…

红队打靶:FourAndSix2.01打靶思路详解(vulnhub)

目录 写在开头 第一步:主机发现与端口扫描 第二步:NFS渗透 第三步:7z压缩包的密码破解 第四步:ssh私钥登录 第五步:lessvi提权 总结与思考 写在开头 本篇博客根据大佬红队笔记的视频进行打靶,详述了…

基于Caffe的静默活体检测识别分析系统

周末的时候看到一个好玩的项目就想着实际拿来使用一下,这个项目主要是做的是开源的跟人脸活体检测相关的内容,这里主要采用的是静默活体检测的方式。 人脸静默活体检测是一种用于验证人脸是真实、活体的技术,而不需要进行任何口头指令或特定…

13.7 CentOS 7 环境下大量创建帐号的方法

13.7.1 一些帐号相关的检查工具 pwck pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息,与实际的主文件夹是否存在等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 内的数据字段错…