SpringBoot整合Redis:Redis优化解决数据一致性问题

news2024/9/23 7:30:49

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏Redis实战与进阶

本专栏讲解Redis从原理到实践

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net


本期我们重点讲一个后端的必考面试题 也是开发中常遇到的问题--数据一致性问题

上一期我们讲到了 SpringBoot如何结合Redis做一个缓存 实现我们减少对数据库压力的一个目的。还不知道怎么做的小伙伴可以先回顾一下前文http://t.csdnimg.cn/tshRD

下面正文

目录

本期我们重点讲一个后端的必考面试题 也是开发中常遇到的问题--数据一致性问题

上一期我们讲到了 SpringBoot如何结合Redis做一个缓存 实现我们减少对数据库压力的一个目的。还不知道怎么做的小伙伴可以先回顾一下前文http://t.csdnimg.cn/tshRD

下面正文

只要使用Redis缓存

就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。如将商品库存缓存在Redis,若价格不对,则下单时就可能出错,这是难以接受的。

什么是缓存和DB的数据一致性?

所以 这里我们先讨论更新的策略  一共是这么几种情况

先删缓存 再更数据库 查缓存未命中则查询数据库 写入缓存 如下

该策略可能导致数据不一致的问题。例如,线程1更新数据前先删除缓存,这时候线程2查询该缓存,发现不存在,则去DB中获取,得到旧值放入缓存,然后线程1更新数据库。这时候就出现了缓存与数据库不一致的问题。

如图就导致了数据不一致 缓存是10  数据库却是20 

所以就有另一种解决方案 先更新数据库 再删缓存

线程1更新了数据库,线程2也更新数据库,这时候由于某种原因,线程2首先更新了缓存,线程1后续更新。 这样就会导致了缓存脏数据的问题,因为目前数据库中存储的是线程2更新后的数据,而缓存存储的是线程1更新的旧数据。

如何解决?

延时双删

1、何为延时双删

它的实现思路是

需要注意的点

延迟的时间如何确定?

总结


只要使用Redis缓存

就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。如将商品库存缓存在Redis,若价格不对,则下单时就可能出错,这是难以接受的。

什么是缓存和DB的数据一致性?

一致性包含如下情况:

  • 缓存有数据 缓存的数据值需和DB相同
  • 缓存无数据 DB是最新值

不符合这两种情况的,都属于缓存和DB数据不一致

所以 这里我们先讨论更新的策略  一共是这么几种情况

先删缓存 再更数据库 查缓存未命中则查询数据库 写入缓存 如下

该策略可能导致数据不一致的问题。例如,线程1更新数据前先删除缓存,这时候线程2查询该缓存,发现不存在,则去DB中获取,得到旧值放入缓存,然后线程1更新数据库。这时候就出现了缓存与数据库不一致的问题。

如图就导致了数据不一致 缓存是10  数据库却是20 

所以就有另一种解决方案 先更新数据库 再删缓存

线程1更新了数据库,线程2也更新数据库,这时候由于某种原因,线程2首先更新了缓存,线程1后续更新。 这样就会导致了缓存脏数据的问题,因为目前数据库中存储的是线程2更新后的数据,而缓存存储的是线程1更新的旧数据。

如何解决?

延时双删

1、何为延时双删

延迟双删(Delay Double Delete)是一种在数据更新或删除时为了保证数据一致性而采取的策略。这种策略通常用于解决数据在缓存和数据库中不一致的问题。

具体来说,在某些场景下,我们需要先更新或删除数据库中的数据,然后再更新或删除缓存中的数据,以保证数据的一致性。

它的实现思路是

在删除缓存之后,让当前线程休眠一段时间,然后再次删除缓存。这个时间段是为了给数据库操作足够的时间来完成,确保数据已经持久化到数据库中。通过延迟双删,可以防止在休眠期间有其他线程读取到旧的缓存数据,从而保证数据的一致性。

值得注意的是,不管哪种方案,都避免不了Redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,得要用到同步锁和对应的业务逻辑层面解决。

RedisUtils.del(key);// 先删除缓存
    updateDB(user);// 更新db中的数据
    Thread.sleep(N);// 延迟一段时间,在删除该缓存key
    RedisUtils.del(key);// 先删除缓存

需要注意的点

上述中(延迟N秒)的时间要大于一次写操作的时间。原因:如果延迟时间小于写入redis的时间,会导致请求1清除了缓存,但是请求2缓存还未写入的尴尬。。。

延迟的时间如何确定?

在业务程序运行时,统计业务逻辑执行读数据和写缓存的操作时间,以此为基础来进行估算。因为这个方案会在第一次删除缓存值后,延迟一段时间再次进行删除,所以称为“延迟双删”。

总结

把几种方案进行总结会得到这样的结论

  1. Cache-Aside(旁路缓存)

    • 应用程序直接与缓存和数据库对话。
    • 优点:适用于读多的应用场景,具有缓存失效弹性,可以直接访问数据库。
    • 缺点:可能导致缓存与数据库不一致。
  2. Read-Through Cache(读取穿透缓存)

    • 缓存与数据库保持一致,当缓存丢失时,从数据库加载数据并填充缓存。
    • 优点:适用于读量较大的工作负载,可以预热缓存。
    • 缺点:第一次请求数据时会导致缓存丢失,额外的数据加载成本。
  3. Write-Through Cache(写入穿透缓存)

    • 先将数据写入缓存,再写入数据库,保持缓存与数据库一致。
    • 优点:结合了读取穿透缓存的好处,提供数据一致性保证。
    • 缺点:引入额外的写延迟。
  4. Write-Around(写入绕过缓存)

    • 数据直接写入数据库,只有读取的数据才能进入缓存。
    • 优点:适用于只写一次、读取次数较少或从不读的情况。
    • 缺点:可能导致缓存未命中,读取性能较低。
  5. Write-Back(写入回写缓存)

    • 应用程序将数据写入缓存,缓存立即确认,并在延迟一段时间后写入数据库。
    • 优点:提高写性能,适用于写工作量大的工作负载,对混合工作负载有效。
    • 缺点:可能导致数据丢失,对数据库故障具有一定弹性。

根据具体的应用场景和需求,可以选择合适的缓存策略或结合多种策略来提高系统性能和数据一致性。

 


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

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

相关文章

3.21总结​.Codeforces 第 935 轮(第 3 组)(A~D)题解​

一.Codeforces 第 935 轮(第 3 组)(A~D)题解 (直接给原文了,我电脑的翻译就是一坨.......) 这到题是一道思维题,理解题目意思就会觉得很简单首先内向的人肯定是一个人一个帐篷,我们只要关心外向的人就可以了,我们只要分外向的人可不可以被3整除,分成两种…

fyne时间选择框-自定义组件,带绑定

实现的效果如图 自定义组件代码: package widgetimport ("fmt""fyne.io/fyne/v2""fyne.io/fyne/v2/container""fyne.io/fyne/v2/widget""strconv""time" )var timeLayout "15:04"type Se…

2024临床常用的心衰评估量表,医生必备!

心衰评估的相关量表,是临床常用的量表类型。常笑医学整理了6个常用的心衰评估量表,包括NYHA心功能分级、Killip分级、2型糖尿病的心衰风险评分、心衰院内死亡率评分、急性失代偿期心衰住院患者6个月死亡率评估、心衰患者1年死亡率评估。这些心衰评估量表…

找不到msvcp110.dll无法继续执行程序的多种解决方法

在计算机操作系统中,msvcp110.dll文件扮演着至关重要的角色。作为Microsoft Visual C Redistributable Package的一部分,这个特定的dll文件包含了系统运行多种应用程序所必需的关键运行时库函数。许多Windows应用程序依赖于msvcp110.dll文件来执行基本操…

2024年【熔化焊接与热切割】模拟考试题库及熔化焊接与热切割实操考试视频

题库来源:安全生产模拟考试一点通公众号小程序 熔化焊接与热切割模拟考试题库参考答案及熔化焊接与热切割考试试题解析是安全生产模拟考试一点通题库老师及熔化焊接与热切割操作证已考过的学员汇总,相对有效帮助熔化焊接与热切割实操考试视频学员顺利通…

jupyter notebook设置代码提示方法

在命令行运行以下代码: pip install jupyter_contrib_nbextensionsjupyter contrib nbextension install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user (有时安装第一行后会自动执行第二行&a…

你的电脑打不开摄像头问题

我一直以为我电脑上的摄像头老是打不开是因为硬件不匹配的问题。知道我发现了我的拯救者Y7000的机身盘边的“摄像头开关”按钮。。。 我去,你的摄像头开关按钮怎么设置在机身旁边啊。。。。 —————————————————————— 2024年3月21日更新记录&a…

Halcon ORC字符识别

OCR(Optical Character Recognition,光学字符识别)是通过使用OCR工具实现的。Halcon提供了一些用于进行字符识别的函数和工具,可以帮助用户实现文本的自动识别和提取。 read_ocr_class_mlp:用于读取一个经过训练好的OC…

Linux系统资源管理

Linux系统资源命令 在Linux中查看系统资源常用命令有哪些 在Linux中,系统资源是指计算机硬件、软件和网络设备等可以利用的一切物质和能量。Linux中的系统资源包括: CPU(中央处理器):用于处理计算机中的指令和数据的…

Springboot+Vue前后端分离的在线图书商城(书城)系统

项目介绍 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

这个简单的生活方式,为你带来满满的幸福感

在今天文章的开头,我想请你思考一个问题:影响幸福感的最大因素是什么? 不妨先想一想,再往下拉,继续阅读。 可能不少朋友的回答,会是财富、事业、理想、生活环境、社会地位…… 这些因素当然对幸福感都非常重…

MO尺度(大气边界层)

在大气表面层( atmospheric surface layer)中,MO参数是用来决定流动是中性或者非中性的一个重要参数。其定义是 z / L z/L z/L,其中 L L L为Obukhov长度,其含义是浮力产生的湍动能和剪切产生的湍动能之比(Hj h AIP 2023)(Monin IAS,1954),具体…

力扣200. 岛屿数量(DFS)

Problem: 200. 岛屿数量 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.遍历矩阵grid的每一个位置;若某个位置为’1’则将用于记录岛屿数量的变量count,并调用dfs函数; 2.dfs函数实现: 2.1.若当前grid位置为’0’…

3.18作业

一、网络属性(getsockopt、setsockopt) 1> 由于在网络通信过程中,套接字是服务于各个层的,但是,每一层中对套接字选项都有一定的权限控制,例如,应用层中对端口号快速重用的限制 2> 如何…

如何在edge上安装拓展weTab

1.点解管理拓展 2.点击获取拓展 3.搜索框输入"wetab"并搜索 4.点击获取按钮 5.点击之后跳出弹窗,点击"添加拓展" 6.回到拓展页面,找到wetab拓展,点击右侧启动拓展 7.打开新的界面,wetab已经启动 8.自定义界面 1. 右键图标可以进行删除操作 2.左下角有个设…

MT2492 16V输入 600KHz 2A DCDC同步降压转换器 航天民芯一级代理

深圳市润泽芯电子有限公司为航天民芯一级代理 描述 MT2492是一款完全集成的高效率产品2A同步整流降压变换器。MT2492在一段时间内高效运行宽输出电流负载范围。该设备提供两种工作模式,即PWM控制和PFM模式切换控制在更宽的工作范围内实现高效率加载。MT2492需要…

IEEE Transactions on Medical Imaging(TMI)论文推荐:2024年01月(2)

Structural Priors Guided Network for the Corneal Endothelial Cell Segmentation 摘要: 角膜内皮显微镜图像中模糊的细胞边界分割具有挑战性,影响临床参数估计的准确性。现有的深度学习方法仅考虑像素分类精度,缺乏对细胞结构知识的利用。因此&#x…

冲刺跑转长跑过程中,新茶饮品牌如何觅增量?

如今,新茶饮行业的发展日趋成熟,并通过资本动作、市场扩张等释放出相关信号。 比如,在资本动作上,IPO已成为新茶饮品牌发展的重要议程。可以看到,截至2023年2月,正在推进港交所IPO的新茶饮企业就有茶百道、…

Spring6--基础概念

1. 概述 1.1. Spring是什么 Spring 是一套广泛应用于 Java 企业级应用开发领域的轻量级开源框架,由 Rod Johnson 创立,旨在显著降低 Java 企业应用的复杂性,缩短开发周期,并提升开发效率。Spring 不仅适用于服务器端开发&#x…

广西开放大学的电大搜题:为学子提供便捷高效的学习辅助

尊敬的读者朋友们,您了解过广西开放大学的电大搜题吗?作为一名现代学者,我有幸为您揭示这个令广大学子受益匪浅的学习利器。电大搜题是广西开放大学为学子们提供的一项便捷高效的学习辅助服务,旨在帮助学子们更好地应对学习难题&a…