Redis缓存一致性问题(自用记录)

背景

在开发过程中,redis缓存技术被大范围应用。由于现在的系统大多是分布式的,高并发的,redis和传统的数据库,存在数据不一致的问题。

解决方案

本文主要探讨两者数据不一致的解决方案:

  1. 给缓存设置过期时间,保证数据的最终一致性
    我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力。
    也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

  2. 通过合理的更新策略保证数据一致性

 - 先更新数据库,再更新缓存-  先删除缓存,再更新数据库-  先删除缓存,再更新数据库

方案的可实施性

1.给缓存设置过期时间,保证数据的最终一致性。
这种方案虽然能保证数据的一致性,但是在一定时间范围内数据存在不一致性

2 更新策略分析
2.1 先更新数据库,再更新缓存。这种方案看似可行,实际并不可靠。原因如下:

同时有请求A和请求B进行更新操作,那么会出现

1)线程A更新了数据库
2)线程B更新了数据库
3)线程B更新了缓存
4)线程A更新了缓存

这就出现请求A更新缓存应该比请求B更新缓存早才对,但是因为网络,运算等原因,B却比A更早更新了缓存。这就导致了脏数据,因此不考虑。

2.2 先删除缓存,再更新数据库。这种方案也极易导致数据不一致。

如下操作

1)请求A进行写操作,删除缓存
2)请求B查询发现缓存不存在
3)请求B去数据库查询得到旧值
4)请求B将旧值写入缓存
5)请求A将新值写入数据库

上述情况就会导致不一致的情形出现。而且,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。

如何解决解决这种问题,采用延时双删技术

1)先淘汰缓存
2)再写数据库(这两步和原来一样)
3)休眠1秒,再次淘汰缓存

有效的将1秒内所造成的缓存脏数据,再次删除。

2.3 先更新数据库,再删除缓存。这种方案是可行性比较高的方案,但也不是绝对的可靠。
两个线程同时进行写操作:

1) 线程A更新数据库
2)线程B更新数据库
3)线程B删除缓存
4)线程A删除缓存

这种情况下不存在问题。但是也存在概率比较低可靠性问题:

1)缓存刚好失效
2)请求A查询数据库,得一个旧值
3)请求B将新值写入数据库
4)请求B删除缓存
5)请求A将查到的旧值写入缓存

这种情况下也会存在脏数据的问题。

为什么这种情况概率比较低?

  1. 这个条件需要发生在读缓存时缓存失效,而且并发着有一个写操作。
  2. 而实际上数据库的写操作会比读操作慢得多,而且还要锁表,而读操作必需在写操作前进入数据库操作,而又要晚于写操作更新缓存,所有的这些条件都具备的概率基本并不大。

那么如何解决?
可以采用延时双删除。

1)更新数据库
2)删除缓存
3)延时几秒再次删除缓存

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

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

相关文章

dell戴尔电脑灵越系列Inspiron 15 3520原厂Win11系统中文版/英文版

Dell戴尔笔记本灵越3520原装出厂Windows11系统包,恢复出厂开箱预装OEM系统 链接:https://pan.baidu.com/s/1mMOAnvXz5NCDO_KImHR5gQ?pwd3nvw 提取码:3nvw 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office办公软件、MyD…

Jmeter接口测试 ,这应该是全网最详细的教程了

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、Jmeter 的使用步骤 打开Jmeter 安装包,进入\bi…

postman-使用Postman的模拟服务来模拟(mock)后端数据,完成前端模拟API调用

最近项目上比较忙,任务多时间紧,导致后端开发任务繁多,无法及时开发完毕,但是前端同学已经把对应功能开发完成,需要进行前后端联调来验证API及一些交互问题;这不能因为后端的进度来影响前端的工作完成情况&…

【Linux进程】冯·诺依曼体系结构以及操作系统的深入理解

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.冯诺依曼体系结构特…

kafka和ZK的关系

zk相当于是kafka的一个基础设施 Kafka是一种高吞吐量、可扩展的分布式发布订阅消息系统,ZooKeeper是一个分布式协调服务,用于管理和协调分布式系统中的各种资源 Zookeeper:管理broker,consumer 创建broker后,向zk注册…

适用于生物行业的样本管理系统

在生物样本管理系统的应用中,我们首先需要了解生物样本的特点和要求。生物样本具有多样性和易变性,需要被妥善保存和跟踪,以确保其质量和可用性。 因此,一个有效的生物样本管理系统需要具备以下特点: 全面性&#xff1…

Spring Event的原理以及缺陷

原理:Spring 事件监听机制及原理分析 - Admol - 博客园 (cnblogs.com) 使用bug:Spring Event 别瞎用!从我司的悲剧中,我总结了6 条最佳实践!-腾讯云开发者社区-腾讯云 (tencent.com)

2024最新任推邦邀请码是什么

任推邦是一款非常受欢迎的推广APP,任推邦邀请码是【222222】获得现金奖励和提成奖励用户可以通过邀请好友加入来获取收益。2024最新的任推邦邀请码是【222222】,小编已经给大家整理好了他趣许多的邀请码,想要领取奖励的小伙伴快来和小编一起了…

聚合函数()不要随意加空格

报错:1630 - FUNCTION link.SUM does not exist. Check the Function Name Parsing and Resolution section in the Reference Manual 解决方法:count、avg、sum等函数后紧随的()之间不能加空格,去掉这个空格即可,因为count()、a…

js 监听元素是否出现在可视区域--IntersectionObserver

观察者模式监听判断dom元素是否在可视区域内 本项目是使用vue3的写法。 1.IntersectionObserver IntersectionObserver可以用来自动监听元素是否进入了设备的可视区域之内,而不需要频繁的计算来做这个判断。由于可见(visible)的本质是&…

融中穿刺路径角度评估的C++技术实现

消融模型的三维渲染 我们以肝部为例,通常肝部在做消融手术规划时有几个步骤。 一三维重建: 对器官进行图像分割; 对肿瘤的原发区域GTV进行勾画。 二穿刺路径的规划: 路径规划当中有几个约束:穿刺深度、危及器官的…

OpenAI推出首个AI视频模型Sora:重塑视频创作与体验

链接:华为OD机考原题附代码 Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展,AI视频模型已成为科技领域的新热点。而在这个浪潮中,OpenAI推出的首个AI视频模型Sora,以其卓越的性能和前瞻性的技术,引领着…

SpringBoot快速整合Thymeleaf实现文件上传案例

SpringBoot快速整合Thymeleaf实现文件上传案例 文章目录 SpringBoot快速整合Thymeleaf实现文件上传案例1. 创建工程2. pom.xml文件2. application.yml 配置3. 前端fileupload.html4. 后端Controller 本案例环境: SpringBoot: 2.3.0.RELEASEJDK: 1.8前端模板: thymel…

【PHP进阶】Redis批处理缓存

大家好,我是程序员若风,又到了技术分享时刻。 概要 在某些场景下,我们需要频繁的使用到缓存,比如需要获取多个key值,如果采用单个拿缓存的办法,会造成网络IO极大的浪费,所以我们需要用户Redis…

Leetcode3036. 匹配模式数组的子数组数目 II

Every day a Leetcode 题目来源:3036. 匹配模式数组的子数组数目 II 解法1:KMP 设数组 nums 的长度为 m,数组 pattern 的长度为 n。 遍历数组 nums 的每个长度是 n1 的子数组并计算子数组的模式,然后与数组 pattern 比较&…

JavaScript 设计模式之观察者模式

观察者模式 观察者模式又被称为发布-订阅模式,使用一个对象来收集订阅者,在发布时遍历所有订阅者,然后将信息传递给订阅者,可以这样来实现一个简单的模式 const Observable (function () {let __messages {}return {register:…

win系统下安装mysql5.7并配置环境变量、设置root用户和服务启动的详细操作教程

本篇文章主要讲解:win系统下安装mysql5.7并配置环境变量、设置root用户和服务启动的详细操作教程 日期:2024年2月22日 作者:任聪聪 一、mysql5.7版本的下载 官方下载地址:https://downloads.mysql.com/archives/community/ 步骤…

服务器生信环境配置脚本

服务器生信环境配置脚本的重要性在于它为生物信息学的数据分析提供了一个统一和标准化的计算环境。通过自动化的配置脚本,可以快速地在服务器上部署和设置生物信息学的软件和依赖库,确保分析的可重复性和准确性。这样,生物信息学家和研究人员…

【鸿蒙 HarmonyOS 4.0】状态管理

一、介绍 资料来自官网:文档中心 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状…

Stable Diffusion 模型的概念、类型、下载、安装、使用

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 大家好,我是水滴~~ 我们在《Stable Diffusion WebUI 界面介绍》 时,第一个就讲到了 Stable Diffusion 模型,那么这个模型是什么?该从哪儿下载&…