当前位置:网站首页>Redis数据更新,是先更新数据库还是先更新缓存?
Redis数据更新,是先更新数据库还是先更新缓存?
2022-07-30 20:51:00 【Yield & Allure】
什么是写时更新和读时更新
写时更新:当我们往数据库写数据的时候我们去更新缓存,包括先更新缓存再更新数据库和先更新数据库再更新缓存。
读时更新:当我们往数据库写数据的时候我们直接删除缓存,然后其他请求读数据的时候更新缓存。包括先删除缓存再更新数据和先更新数据库再删除缓存。
缓存更新到底是读更新好还是写更新好?
读更新好,为什么?
- 如果你是一个写数据库场景比较多,而读数据场景比较少的业务需求,采用这种方案就会导致,数据压根还没读到,缓存就被频繁的更新,浪费性能。
- 同时有请求A和请求B进行更新操作,那么会出现 (1)线程A更新了数据库 (2)线程B更新了数据库 (3)线程B更新了缓存 (4)线程A更新了缓存。这就出现请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存。这就导致了脏数据,因此不考虑。
那么也就是说,如果是写更新的话,不管从性能的角度还是从线程安全的角度来说这种方案都不好。
读时更新有没有什么问题?
前面我们说了,如果是写更新,会有效率和线程安全性的问题,那如果是读更新又会有什么问题呢?
读时更新:当我们往数据库写数据的时候我们直接删除缓存,然后其他请求读数据的时候更新缓存。包括先删除缓存再更新数据库和先更新数据库再删除缓存。
先更新数据库再删除缓存
问题一、如果在高并发的场景下,会出现数据库与缓存数据不一致
- 缓存刚好失效 线程 A 查询数据库,得一个旧值
- 线程 B 将新值写入数据库
- 线程 B 删除缓存
- 线程 A 将查到的旧值写入缓存
但出现的概率特别低,为什么呢?
我们需要线程A读操作必需在B线程写操作前进入数据库操作,而又要晚于B写操作更新缓存,所有的这些条件都具备的概率基本并不大。那么如何解决这个低概率问题呢?
设置缓存的过期时间,这样可以达到最终一致性
问题二、如果删除缓存失败或更新数据库失败了会怎样?
- 第一步操作数据库成功,第二步删除缓存失败,会导致数据库里是新数据,而缓存里是旧数据。
- 第一步操作数据库就失败了,第二步更新缓存不会执行,不会出现数据不一致。
如何解决删除缓存失败的问题?
将需要删除的 key 发送到消息队列中 自己消费消息,获得需要删除的 key 不断重试删除操作,直到成功
先删除缓存再更新数据库
问题一、如果在高并发的场景下,会出现数据库与缓存数据不一致
- 线程 A 删除了缓存 线程 B 查询,发现缓存已不存在
- 线程 B 去数据库查询得到旧值
- 线程 B 将旧值写入缓存
- 线程 A 将新值写入数据库
如何解决?设置缓存的过期时间,这样可以达到最终一致性
问题二、如果删除缓存失败或更新数据库失败了会怎样?
- 第一步删除缓存成功,第二步更新数据库失败,数据库和缓存的数据还是一致的。
- 第一步删除缓存就失败了,第二步更新数据库不会去执行,数据库和缓存的数据还是一致的。
也就是说并不会导致数据不一致问题。
小总结:对比两种策略
先删除缓存,再更新数据库:在高并发下相对更容易出现数据不一致问题,但在原子性被破坏时(删除缓存失败或更新数据库失败)并不会出现数据一致性问题
先更新数据库,再删除缓存:在高并发下相对出现数据不一致问题概率很低,但在原子性被破坏时(删除缓存失败或更新数据库失败)会出现数据一致性问题
要解决这一切的比较简单的解决方案就是要给KEY设置过期时间
边栏推荐
猜你喜欢

《快速掌握QML》第六章 动画

外包干了三年,废了...
![Recommendation System - Sorting Layer - Model (1): Embedding + MLP (Multilayer Perceptron) Model [Deep Crossing Model: Classic Embedding + MLP Model Structure]](/img/bb/25b0493398901b52d40ff11a21e34c.png)
Recommendation System - Sorting Layer - Model (1): Embedding + MLP (Multilayer Perceptron) Model [Deep Crossing Model: Classic Embedding + MLP Model Structure]

MySQL的DATE_FORMAT()函数将Date转为字符串

PPT如何开启演讲者模式?PPT开启演讲者模式的方法

第04章 逻辑架构【1.MySQL架构篇】【MySQL高级】

To the operation of the int variable assignment is atom?

MySQL----多表查询

Use the map function to operate on each element in the list It seems that you don't need a map

Oblique document scanning and character recognition (opencv, coordinate transformation analysis)
随机推荐
MySQL 多表关联一对多查询实现取最新一条数据
网络安全实验环境搭建
C language: detailed explanation of operators
Office365无法打开word文档怎么办?Office365无法打开word文档的解决方法
chrome扩展:如何使对话框位于当前窗口的右侧?
MVC模式和三层架构
是对称矩阵的对角化
What is the common factor
Multi-threaded mutex application RAII mechanism
服务器不稳定因素
[PM only] Quickly count who else in the team has not registered and reported information, and quickly screen out the members of their own project team who have not completed the list of XXX work items
巴比特 | 元宇宙每日必读:洗牌将至,数藏行业下半场是否会迎来新一批领头羊?是否会出现新玩法?...
MYSQL JDBC图书管理系统
C语言中指针没那么难~ (1)【文章结尾有资料】
MySQL BIGINT 数据类型
【回归预测-CNN预测】基于卷积神经网络CNN实现数据回归预测附matlab代码
Cookie中的JSESSIONID说明
Zabbix部署与练习
Swift RegexBuilder Vs. Raku Grammar
TensorFlow2: Overview