Redis解决缓存一致性问题

文章目录

  • ☃️概述
  • ☃️数据库和缓存不一致采用什么方案
  • ☃️代码实现
  • ☃️其他


在这里插入图片描述

在这里插入图片描述


☃️概述

由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是:

用户使用缓存中的过时数据,就会产生类似多线程数据安全问题,从而影响业务,产品口碑等;怎么解决呢?有如下几种方案

人工编码方式:缓存调用者在更新完数据库后再去更新缓存,也称之为双写方案

由系统本身完成:数据库与缓存的问题交由系统本身去处理

调用者只操作缓存:其他线程去异步处理数据库,实现最终一致


☃️数据库和缓存不一致采用什么方案

综合考虑使用方案一,但是方案一调用者如何处理呢?这里有几个问题

操作缓存和数据库时有三个问题需要考虑:

如果采用第一个方案,那么假设我们每次操作数据库后,都操作缓存,但是中间如果没有人查询,那么这个更新动作实际上只有最后一次生效,中间的更新动作意义并不大,我们可以把缓存删除,等待再次查询时,将缓存中的数据加载出来

  • 删除缓存还是更新缓存?

    • 更新缓存:每次更新数据库都更新缓存,无效写操作较多
    • 删除缓存:更新数据库时让缓存失效,查询时再更新缓存
  • 如何保证缓存与数据库的操作的同时成功或失败?

    • 单体系统,将缓存与数据库操作放在一个事务
    • 分布式系统,利用TCC等分布式事务方案

应该具体操作缓存还是操作数据库,我们应当是先操作数据库,再删除缓存,原因在于,如果你选择第一种方案,在两个线程并发来访问时,假设线程1先来,他先把缓存删了,此时线程2过来,他查询缓存数据并不存在,此时他写入缓存,当他写入缓存后,线程1再执行更新动作时,实际上写入的就是旧的数据,新的数据被旧数据覆盖了。

  • 先操作缓存还是先操作数据库?
    • 先删除缓存,再操作数据库
    • 先操作数据库,再删除缓存

在这里插入图片描述


☃️代码实现

根据id查询数据时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间

根据id修改数据时,先修改数据库,再删除缓存

@Transactionl
public Result update(){
//	执行更新逻辑


//	删除缓存
}

☃️其他

要保证数据库和Redis缓存之间的一致性,可以采用以下策略:

  • 缓存-旁路(Cache-Aside,Lazy Loading):在这种方式中,应用程序首先检查缓存中是否存在所需数据。如果缓存中存在数据,则直接返回给应用程序。如果缓存中不存在数据,则从数据库中获取,然后将数据存储到缓存中以备后续请求使用。为了保持一致性,当数据库中的数据更新时,你需要显式地使缓存中对应的数据失效或更新,可以在数据库更新后立即删除或更新缓存中的数据。

  • 读写-通过(Read-Through,Write-Through):在这种模式下,应用程序同时向数据库和缓存读写数据。当数据库中的数据更新时,缓存中的数据也会同时更新。同样,当从缓存中读取数据时,如果不存在,就从数据库中获取,然后再存储到缓存中。这确保了数据库和缓存的数据保持一致。

  • 写入-通过(Write-Through):类似于读写-通过,但在这种方法中,当数据写入数据库时,也会立即写入缓存。然而,读取操作仍然是从缓存中进行。这有助于减少缓存未命中的次数。

  • 缓存失效(Cache Invalidation):不是在每次数据库更新时都更新缓存,你可以选择使受影响的数据缓存失效。这意味着从缓存中删除过期的数据,这样下一次读取操作将从数据库中获取最新的数据。缓存失效可以通过应用程序中的触发器或事件来实现,它们检测数据库中的更改,然后通知缓存使相应的数据失效。

  • 生存时间(Time-To-Live,TTL):你可以为缓存的数据设置过期时间。这样即使数据库发生了更新,缓存也会在一定时间后过期,然后重新从数据库获取新鲜数据。

通过采用这些策略中的一种或多种组合,你可以在应用程序中保持数据库和Redis缓存之间的一致性。每种方法都有其复杂性、性能和一致性保证方面的权衡,所以选择最适合你应用需求的策略即可。

在这里插入图片描述



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

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

相关文章

简爱的思维导图怎么做?从这三个角度

简爱的思维导图怎么做?《简爱》作为夏洛蒂勃朗特的代表作,不仅是一部经典的爱情小说,也是探索女性独立与自我成长的文学巨著。为了深入理解这部作品,制作思维导图是一种高效的学习和分析工具。以下是三种不同的角度来创建《简爱》…

【LeetCode算法】第88题:合并两个有序数组

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:首次想到的解法:定义一个mn长度的辅助数组,从头遍历这两个数组,谁小就放进辅助数组中并且对应往后走,最后使用memcpy函…

VSCode开发Python-Django入门

一、安装配置Python环境及配置Python环境变量 1、python安装包安装后,需要注意pip.exe和pip3.exe的安装; 2、环境变量需要配置两个目录; 3、验证python是否安装成功 通过cmd命令执行:python --version 查看python版本&#xff…

解决 DataGrip 2024.1.3 连接 Tdengine 时timestamp字段显示时区不正确问题

设置中找到该设置,将原来的设置 yyyy-MM-dd HH:mm:ss 修改为: yyyy-MM-dd HH:mm:ss.SSS z 即可。 注意:只能修改第一个,修改后提示错误,但是查询数据时能成功格式化时间,修改第二个不生效,可能是 bug 具体格式见: Date…

如何取消公众号的在线客服绑定授权

1,功能设置 2,公众号设置 3,查看详情,取消

2024年新算法-秘书鸟优化算法(SBOA)优化BP神经网络回归预测

2024年新算法-秘书鸟优化算法(SBOA)优化BP神经网络回归预测 亮点: 输出多个评价指标:R2,RMSE,MSE,MAPE和MAE 满足需求,分开运行和对比的都有对应的主函数:main_BP, main_SBOA, main_BPvsBP_SB…

书生·浦语第二期-笔记2

课程链接:https://github.com/InternLM/Tutorial/tree/camp2 视频地址:轻松玩转书生浦语大模型趣味Demo_哔哩哔哩_bilibili 大模型及InternLM介绍 大模型:人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型 特点&#xff1a…

使用ssh连接ubuntu

一、下载连接工具 常见的连接工具右fianlshell、xshell等等。在本文章中使用的finalshell,工具可以去官网上下载,官网下载。 二、Ubuntu中配置shh 1、使用下面指令更新软件包(常用于下载安装或更新软件时使用,更新到最新的安装…

【鸟叔的Linux私房菜】2-主机规划与磁盘分区

文章目录 2.1 Linux与硬件的搭配各硬件设备在Linux的文件名使用虚拟机学习 2.2 磁盘分区磁盘连接方式和设备文件名的关系MBR(MS-DOS)与GPT磁盘分区表MBR(MS-DOS)GPT磁盘分区表 启动流程的BIOS与UEFI启动检测程序BIOS搭配MBR/GPT的启动流程UEFI BIOS搭配 GPT启动的流程 Linux安装…

B站pink老师HTML5基础(一)

文章目录 一、网页1.什么是网页2.什么是HTML二、常用浏览器 三、Web标准四、HTML标签1.HTML基本结构标签 五、快捷键六、常用标签1.标题标签2.段落和换行标签3.文本格式化标签4.div标签和span标签5.图像标签6.图像路径7.超链接标签8.特殊字符 一、网页 1.什么是网页 2.什么是H…

Mybatis入门——其他查询操作和数据库连接池(4)

目录 一、多表查询 二、#{} 和 ${} 1、#{} 和 ${} 的使用 (1)Integer类型的参数 #{} 的使用 ${} 的使用 (2)使用String类型的参数 #{} 的使用 ${} 的使用 小结: 2、#{} 和 ${} 的区别 (1&#…

3、python安装-linux系统下

安装前置依赖软件,安装完成后,打开官网,下载linux系统下的python安装包: 选择最新的版本 点击最新版本,进入版本对应的界面, 选择第一个进行源码的编译,右键选择复制连接地址, 回到终…

懒人创业秘诀揭秘:加入萤瓴优选项目,普通人也能打开财富大门

创业对于很多人来说,是一个艰难而复杂的过程。然而,时代的发展带来了新的机遇,懒人创业成为了一种趋势。加入萤瓴优选项目,普通人也能轻松打开财富大门。本文将揭秘懒人创业的秘诀,并分析萤瓴优选项目如何帮助普通人实…

Thingsboard规则链:Switch节点详解

在物联网(IoT)领域,数据的高效处理与自动化决策是构建智能系统的核心。作为一款强大的物联网平台,Thingsboard通过其规则引擎为开发者提供了高度灵活的工具,其中Switch节点是实现消息条件路由的关键组件。本文将全方位…

[leetcode hot 150]第五十六题,合并区间

题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 思路: 这道题目要求合并一…

从技术的角度剖析Nginx框架

众所周知,nginx 性能高,而 nginx 的高性能与其架构是分不开的。 1、nginx 多进程模式架构 nginx 启动后,会有一个master 进程和多个 worker 进程。 master 进程用来管理 worker 进程,功能包含:接收来自外界的信号&a…

智能跳绳的产品体验与思考(一)

我,虽称不上跳绳高手,却对这项运动怀有深厚的热爱,也曾在某电商平台上选购过一款智能跳绳,希望能借此提升我的跳绳技巧。今天,咱们就来聊聊我和这条绳子的发生的一些故事,外加我的一些思考。 此刻&#xf…

如何利用 Selenium 对已打开的浏览器进行爬虫

大家好! 在对某些网站进行爬虫时,如果该网站做了限制,必须完成登录才能展示数据,而且只能通过短信验证码才能登录 这时候,我们可以通过一个已经开启的浏览器完成登录,然后利用程序继续操作这个浏览器&…

K8s集群中的Pod调度约束亲和性与反亲和性

前言 在 K8s 集群管理中,Pod 的调度约束——亲和性(Affinity)与反亲和性(Anti-Affinity)这两种机制允许管理员精细控制 Pod 在集群内的分布方式,以适应多样化的业务需求和运维策略。本篇将介绍 K8s 集群中…

BookxNote Pro 宝藏 PDF 笔记软件

一、简介 1、BookxNote Pro 是一款专为电子书阅读和学习笔记设计的软件,支持多种电子书格式,如PDF和EPUB,能够帮助用户高效地管理和阅读电子书籍,同时具备强大的笔记功能,允许用户对书籍内容进行标注、摘录和思维导图绘…