图文讲解Redis延时双删原因及必要性

news2024/12/27 0:15:11

目录

一、前言

二、常见更新策略

2.1 先删缓存,再更新数据库

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

2.3 普通双删

2.4 延迟双删

三、建议

一、前言

我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力,但是当更新数据库时,如何保证缓存及数据库一致性,一般我们采用延时双删策略。

目前系统中常用的做法是一个查询接口,先查询Redis,如果不存在则查询数据库,并将结果放入到Redis中。

为什么是删除缓存,而不是更新缓存呢?主要是如果缓存的内容是带有树型结构或者List,Map,那么更新其中一个内容相对较慢。

本文所讲操作,均是按照如果缓存不存在,查询数据库后,再放入Redis。

二、常见更新策略

2.1 先删缓存,再更新数据库

如图:

1、线程A删除缓存数据,此时还没更新数据库 

2、线程B查询缓存没有数据,查询数据库还是旧数据,放入缓存

3、线程C及其他线程使用旧缓存数据,缓存和数据库不一致

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

1、线程A更新数据库,此时还没有删除缓存

2、线程B及其他线程此时使用的还是旧缓存数据,和数据库内容不一致

2.3 普通双删

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

2、线程B查询缓存没有数据,在线程A更新数据库之前,查询到旧数据,此时系统时间片切换到线程A执行删除缓存,之后又轮到线程B放入缓存旧数据

3、线程C针对于线程A,查询缓存没有数据,查询到旧数据,放入缓存旧数据

都不能满足缓存和数据一致性。

2.4 延迟双删

1、线程A先删除缓存,之后更新数据库

2、线程B和线程C发现缓存没数据,查询数据库。线程B查询到的是旧数据,线程C查询到的是新数据。之后纷纷放入缓存

3、线程A延时3-5秒(时间一般要大于SQL执行时间+线程切换执行时间100ms足够),再将缓存删除。之后其他线程再查询缓存,发现没数据,再次查询数据库及放入缓存都是新数据

极端情况就是线程D,所以延时双删还是不一定能保证缓存及数据一致。

三、建议

1、在发现缓存没有数据后,在执行查询数据库前,对该Key进行加锁,查询数据库并放入缓存后再解锁,这样可以避免缓存击穿问题,当某个redis数据不存在时,大量线程并发查询数据库。

2、在需要执行双删前,对该Key进行加锁,之后执行删除缓存,更新数据库,放入新数据到缓存,在解锁。保证缓存和数据一致性。

3、加锁的Key都需要设置过期时间,避免因为宕机造成死锁。

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

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

相关文章

今天实习第三天,vue(cli部分)

01.创建第一个vue-cli。这里用的是node.js。早上的时候,就需要把node.js安装上去 02.node.js安装 第一步.去官网下载node.js https://nodejs.org/en 第二步.运行官网下载的node.js的msi文件(记住所有的node.js文件的安装包都是msi文件的形式&#xff0…

算法笔记\python 笔记: 相似性度量

1 欧氏距离 1.1 python实现: from scipy.spatial import distance distance.euclidean([1,2],[2,1]) #1.4142135623730951 1.2 标准化欧氏距离 先将数据标准化 (减去的均值两两抵消) 2 曼哈顿距离 又称为城市街区距离 2.1 python 实现 f…

C++图形开发(16):绘制一个圆环和一根针

文章目录 绘制一个圆环和一根针1.1 绘制1.2 line()函数1.3 circle()函数1.4 setlinestyle()函数1.5 setlinecolor()函数 接下来,我会继续制作一些小游戏,但因为整个难度的上升(毕竟我也是初学者),可能文章不会再像之前…

吐血整理,性能测试-Jmeter分布式压测实战(超细详解)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Jmeter的集群模式…

InsCode Stable Diffusion使用教程【InsCode Stable Diffusion美图活动一期】

记录一下如何使用 InsCode Stable Diffusion 进行 AI 绘图以及使用感受。 一、背景介绍 目前市面上比较权威,并能用于工作中的 AI 绘画软件其实就两款。一个叫 Midjourney(简称 MJ),另一个叫 Stable Diffusion(简称 …

Unity游戏源码分享-Unity经营类美食小摊小游戏

Unity经营类美食小摊小游戏 挺有意思的小游戏 关卡页面 游戏主页面 有顾客上门 需要给顾客搭配他们想要的美食 会不断地有顾客过来,这个时候就考验手速的时候了,真实模拟经营 服务到位立马有钱 项目地址: https://download.csdn.net/downl…

VisualStudio2022将printf信息打印到控制台

点击“解决方案管理器”,选中项目名称,点击鼠标右键---->属性---->生成事件---->生成后事件,在命令行的右侧输入框里填写如下内容: editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$(ProjectName).exe接下来在编译运行时&#x…

数据库--->MySQL(2)【事务、SQL优化】

文章目录 事务什么是事务?隔离性中的不同隔离级别事务实现的原理隔离级别的实现原理(MVCC)MySQL中的锁机制 SQL优化 事务 什么是事务? 事务就是逻辑上的一组操作,在同一个事务中,如果有多条sql语句执行&am…

一文详解新一代高效前端构建工具VITE-达观数据

Vite 是一个快速、简单且高效的前端构建工具,它的出现为前端开发者带来了新的构建体验。在本文中,我们将探讨 Vite 的技术原理、优点和使用方法。 Vite 的技术原理 Vite 的核心技术是基于 ES Modules 和浏览器原生模块系统的构建工具。Vite 的构建过程是…

多态的基本使用

这部分的内容主要是记住使用方法,原理在之后会讲。 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 比如说买票,普通人买票就是正常买&…

WTM框架页面被其他网站引用免登录

用ASP.NET CORE开发通常都会有这样一个需求,自己框架开发的页面,要被其他网站嵌套引用,但其他网站通过链接到自己的开发页面的时候,通常会有一个登录页面,有的时候网站无缝集成的时候,这就会要求跳过这个WT…

前端实现 DIV 高度只有100px,宽度只有100px ,我要在这个DIV放一个宽度200的DIV,左右拉动滚动条显示

<!DOCTYPE html> <html> <head><title>点击监听两组span标签</title><style>.outer-div {width: 100px;height: 100px;overflow-x: scroll;background-color: #abc1ee;}.inner-div {width: 200px;}/* 自定义滚动条样式 */.outer-div::-web…

Java 的集合

一、Collection 1、ArrayList 底层采用数组实现&#xff0c;操作大多基于对数组的操作。 在添加和删除时需要做 System.arraycopy(native层方法) 拷贝工作。 添加元素时可能会扩容&#xff0c;这要大量的拷贝工作&#xff0c;删除元素时&#xff0c;会把后面的元素向前拷贝。…

剑指oferr68-II.二叉树的最近公共祖先

为什么这道题的难度是easy&#xff0c;我感觉挺难的啊&#xff0c;我想了挺久没有一点思路就直接看题解了。题解有两种解法&#xff0c;先看第一种存储父节点 class Solution {Map<Integer,TreeNode> parent new HashMap<Integer,TreeNode>();Set<Integer>…

ffmpeg2段视频合成一段

查看分辨率 帧率和编码器 ffprobe -v error -select_streams v:0 -show_entries streamcodec_name,width,height,avg_frame_rate -of defaultnoprint_wrappers1 rs2.mp4得到&#xff0c;编码器&#xff0c;分辨率&#xff0c;还有帧率 codec_nameh264 width1920 height1080 avg…

小白到运维工程师自学之路 第五十二集 (三剑客之awk)

一、概述 awk命令是一种在Unix或类Unix系统上使用的文本处理工具。它以行为单位读取输入文件&#xff0c;按照预定义规则对每一行进行处理并生成输出。 通过使用一种简单的编程语言&#xff0c;awk提供了对文本数据进行过滤、处理和转换的强大能力。它可以轻松地提取文本中的…

实验四 交换机 VLAN 配置

文章目录 实验目的实验原理实验内容实验总结 实验目的 理解 VLAN 的概念、原理&#xff1b;掌握基于交换机端口的 VLAN 划分方法&#xff1b;掌握 Cisco2950 交换机的单交换机和跨交换机 VLAN 配置方法。 实验原理 &#xff08;1&#xff09;VLAN 的概念 VLAN&#xff08;Vi…

CQ 社区版 2.2.0 发布 | 配置要求降为 4 核 16G!!!

&#x1f389;&#x1f389;&#x1f389; 喜大普奔&#xff01;&#xff01;&#xff01; 经过我们研发团队的不断努力&#xff0c;CloudQuery 终于「瘦身」成功啦&#xff01;&#xff01;&#xff01; 本次发布的 v2.2.0 版本&#xff0c;推荐配置降为&#xff1a; CPU&a…

【iOS内存管理-内存的几大区域】

前言 iOS内存管理的第一篇章&#xff0c;了解iOS内存的五大分区。 总览 iOS中&#xff0c;内存主要分为五大区域&#xff1a;栈区&#xff0c;堆区&#xff0c;全局区/静态区&#xff0c;常量区和代码区。总览图如下。 如上图所示&#xff0c;代码区是在低地址段存放&#x…

关于AWS MSK Connector Execution Role的解释

尽管在创建AWS MSK Connector时&#xff0c;Execution Role是一个必填项&#xff0c;就像下面这样&#xff1a; 并且在官方文档中给出的Execution Role样例&#xff1a; https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-service-execution-role.html 中也…