Redis维护缓存的方案选择

Redis中间件常常被用作缓存,而当使用了缓存的时候,缓存中数据的维护,往往是需要重点关注的,尤其是重点考虑的是数据一致性问题。以下是维护数据库缓存的一些常用方案。

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

导致数据不一致的场景:

最终结果:数据库存储的是新值,缓存存储的是旧值,导致数据不一致

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

最终结果:A线程删除缓存失败,导致缓存中一直存的是旧值。但是实际上,删除缓存失败这个异常场景不在此范围讨论中(可以加入重试机制),因此,此方案数据一致性问题不大,但是可能导致穿透问题(缓存数据删除后,瞬间大量请求穿过缓存,直接打到数据库。但是,但凡是删除缓存都有可能导致穿透问题)

3、先更新数据库,然后更新缓存

最终结果:更新缓存的时间不确定,有先有后,可能导致旧值覆盖新值的问题。而且性能不好,一万次请求就得更新一万次缓存。

4、延时双删

在方案一的基础上,增加了一次删除缓存的操作。回想方案一,导致数据不一致的问题是,A线程在B线程之后更新完数据库后,没有去处理缓存数据。因此,在更新完数据库后,再删除一次缓存便可(本质上就是方案一与方案二的结合)

总体流程:先删除缓存,然后再更新数据库,更新完数据库后,延时再删除一次缓存,做兜底操作。

更新数据库前删一次缓存,是因为,防止在更新数据库后的瞬间,有人直接命中缓存,拿到旧数据

更新数据库后再删一次缓存,是因为,有人通过查库拿到旧数据,设置值进了缓存(方案一数据不一致的情况),之所以要延时,是因为要保证,第二次删除的时机要在其他人写数据之后,否则白删。

注意:既然是删除缓存数据,依然会导致缓存穿透的问题。

根据实际业务场景,我选择了方案三:先更新数据库,再更新缓存。原因如下:

1、修改缓存的入口只有一个,在控制台中设置,不存在多个线程修改缓存的情况

2、读的入口有多个,有许多定时器会在自己的业务中读缓存值,有并发且量十分大,因此,需要考虑缓存穿透问题(不能删除缓存)

3、缓存中存的实际是业务配置,读多写少,大量更新操作导致性能消耗的场景不存在

每一种方案都存在他的优缺点。在理想中,我们往往希望能适用所有场景的方案,但是,现实往往很骨感,一劳永逸的方法几乎只存在于某个乌托邦。方案没有好坏之分,只有是否适合自己的应用场景之别。

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

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

相关文章

VS2022 配置 OpenCV并开始第一个程序

VS2022安装 首先下载 VisualStudioSetup.exe 下载连接:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 点击上面的链接即可进入到下载页面。进入到下载页面,可看到有几个版本可选,如下: 我选择的是企业版:E…

RT-DETR算法优化改进:Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

本文改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375…

java+ 如何动态配置业务规则组

思路 1. 实现在页面上的动态配置规则组(2张数据表枚举类serviceimplaction) 2. 从数据库中表staffmoverules(规则明细表)或者staffmovetyperule(规则组表) ,根据传入类型,取出规则编…

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于热交换算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于热交换优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

苍穹外卖--员工分页查询

请求参数封装: Data public class EmployeePageQueryDTO implements Serializable {//员工姓名private String name;//页码private int page;//每页显示记录数private int pageSize;}请求结果封装: public class PageResult implements Serializable {…

C++各种字符转换

C各种字符转换 一.如何将char数组转化为string类型二. string转char数组:参考 一.如何将char数组转化为string类型 在C中,可以使用string的构造函数或者赋值操作符来将char数组转换为string类型。 方法1:使用string的构造函数 const char* c…

iframe父子页面通信相互调用传递参数多个postMessage

效果 如何运行 父页面代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

[C/C++]数据结构 链表(单向链表,双向链表)

前言: 上一文中我们介绍了顺序表的特点及实现,但是顺序表由于每次扩容都是呈二倍增长(扩容大小是自己定义的),可能会造成空间的大量浪费,但是链表却可以解决这个问题. 概念及结构: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接…

cs与msf联动

实验环境 cs4.4(4.5版本不知道为啥实现不了) cs服务器与msf在同一台vps上 本地win7虚拟机 cs派生会话给msf 首先cs正常上线win7&#xff0c;这就不多说了&#xff0c;然后说如何将会话派生给msf cs准备 选择Foreign&#xff0c;这里可以选HTTP&#xff0c;也可以选HTTPS…

AnimateDiff搭配Stable diffution制作AI视频

话不多说&#xff0c;先看视频 1. AnimateDiff的技术原理 AnimateDiff可以搭配扩散模型算法&#xff08;Stable Diffusion&#xff09;来生成高质量的动态视频&#xff0c;其中动态模型&#xff08;Motion Models&#xff09;用来实时跟踪人物的动作以及画面的改变。我们使用 …

基于和声算法优化概率神经网络PNN的分类预测 - 附代码

基于和声算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于和声算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于和声优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

【开源】基于JAVA的快递管理系统

项目编号&#xff1a; S 007 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S007&#xff0c;文末获取源码。} 项目编号&#xff1a;S007&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…