Redis缓存和数据库不一致性

news/2024/11/20 21:29:53/

先更新数据库,再删除缓存,如果删除缓存失败了,会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。一般普通的解决方式有下面两个:

先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。

延时双删,先更新数据库,再删除缓存,5s之后再执行一次删除操作。

public void set(key, value) {putToDb(key, value);deleteFromRedis(key);// ... a few seconds laterdeleteFromRedis(key);
}

有一个请求过来对数据进行变更操作,先删除缓存,然后修改数据库,数据库数据没修改完之前又过来一个请求,去读缓存,发现缓存空了,然后查询数据库,查到了修改前的旧数据,放到了缓存中,然后第一个请求完成了对数据库的修改,此时就造成数据库和缓存中的数据不一样的情况。

分析:数据并发进行读写的时候才可能出现这种问题,如果并发量很低,特别是读并发,每天访问量就1万次,很少的情况下会出现这种不一致的场景。如果每天是上亿的流量,每秒并发读是几万,每秒只要有数据更新的请求,就可能会出现数据库+缓存不一致的情况。

解决方案:更新数据的时候根据数据的唯一标识,将缓存更新的请求发送到一个jvm内存队列中,然后同步等待缓存更新完成。一个数据变更的操作,先删除


http://www.ppmy.cn/news/12503.html

相关文章

【指针笔试题下】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!

目录 前言 笔试题1: 笔试题2: 笔试题3: 笔试题4: 笔试题5: 笔试题6: 笔试题7: 笔试题8: 总结: 博客主页:张栩睿的博客主页 欢迎关注:点赞收藏留…

springMVC的学习拦截器之验证用户登录案例

文章目录实现思路关于环境和配置文件pomspring的配置文件关于idea的通病/常见500错误的避坑实现步骤编写登陆页面编写Controller处理请求编写登录成功的页面编写登录拦截器实现思路 有一个登录页面,需要写一个controller访问页面登陆页面提供填写用户名和密码的表单…

基于matlab的指纹图像处理、脊线增强、脊线分割、脊线细化、细节点检测和细节点验证

需求分析对于指纹的特征提取包含几个步骤,脊线增强、脊线分割、脊线细化、细节点检测和细节点验证,本次大作业需要针对已经增强的指纹图片进行后续几个步骤,通过多种形态学算法进行分割、细化、细化后处理,找到其中的端点和分叉点…

Swift return陷阱

return后还会执行后边的代码 我们来看下边一个例子: func test() -> Bool {print("1 test")return falseprint("2 test") }func test2() {print("1 test2")returnprint("2 test2") }test() test2()输出: 1…

【数据结构】保姆级单链表教程(概念、分类与实现)

目录 🍊前言🍊: 🍈一、链表概述🍈: 1.链表的概念及结构: 2.链表存在的意义: 🍓二、链表的分类🍓: 🥝三、单链表的实现&#x1f…

寻找两个正序数组的中位数

题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入…

Java使用Zxing二维码生成

目录 1、二维码简介 二维码纠错级别 2、ZXing简介 3、示例 3.1 搭建一个maven项目,引入Zxing依赖包 3.2 创建QrCodeUtil.java 类 1、二维码简介 二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录…

react受控组件和非受控组件区别

一、受控组件 在HTML中,表单元素的标签、、等的值改变通常是根据用户输入进行更新。 在React中,可变状态通常保存在组件的状态属性中,并且只能使用 setState() 进行更新,而呈现表单的React组件也控制着在后续用户输入时该表单中发…