[Redis]——数据一致性,先操作数据库,还是先更新缓存?

目录

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

1.删除缓存还是更新缓存?

2.如何保证缓存与数据库的操作同时成功或失效

3.先操作缓存还是先操作数据库(多线程并发问题)

[二、 缓存更新的最佳策略](#二、 缓存更新的最佳策略)


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

1.删除缓存还是更新缓存?

  • 更新缓存:每次更新数据库都更新缓存,如果写多读少,这样效率太低。
  • 删除缓存:更新数据的同时让缓存失效,查询时再更新缓存。

🌳我们一般会采用删除缓存策略。

2.如何保证缓存与数据库的操作同时成功或失效

  • 单体系统,将缓存与数据库操作放在一个事务,利用事物本身原子性来保证。
  • 分布式系统,利用TCC等分布式事务方案。

3.先操作缓存还是先操作数据库(多线程并发问题)

  • 先删除缓存,在操作数据库
  • 先操作数据库,在删除缓存

那哪一种比较好呢❓

解释:

如果在线程1删除缓存,更新数据库的时候,线程2查询该数据,未命中,然后写入缓存,这就导致了数据库与缓存不一致,并且这种情况发生的概率很大,因为更新的时间可能是比较久的,而操作缓存是很快的,所以这种方式不好

另一种方式

解释:

如果某一时刻,缓存突然失效了,线程1查询缓存未命中,准备写入缓存,这是线程2来更新数据库了,然后删除缓存,再然后线程1就要写入缓存了,数据又不一致了,但是这种情况发生的概率很小。

二、 缓存更新的最佳策略

主动更新缓存,并以超时剔除作为兜底方案,因为如果缓存过多可能导致内存不足

读操作:

  • 缓存命中直接返回
  • 未命中则查询数据库,并写入缓存,设定超时时间

写操作:

  • 先操作数据库,然后再删除缓存
  • 确保数据库和删缓存操作的一致性
相关推荐
qing222222223 分钟前
非void函数缺少返回值导致的程序崩溃
数据库
shyの同学9 分钟前
Spring事务:为什么catch了异常,事务还是回滚了?
数据库·spring·事务·spring事务
xuanloyer11 分钟前
oracle从入门到精通--物理存储结构
数据库·oracle
chenzhou__13 分钟前
LinuxC语言并发程序笔记补充
linux·c语言·数据库·笔记·学习·进程
别或许16 分钟前
14、使用C++连接MySQL及接口
数据库·mysql
阿里云云原生18 分钟前
阿里云 ARMS 自定义指标采集:打破传统 APM 局限,实现业务可视化监控
数据库·阿里云·云原生·oracle·arms
lu9up27 分钟前
业务表异常阻塞导致接口超时处理案例
数据库·性能优化
y***613127 分钟前
PHP操作redis
开发语言·redis·php
⑩-31 分钟前
Redis GEO
java·redis
San30.1 小时前
从 Mobile First 到 AI First:用 Python 和大模型让数据库“开口说话”
数据库·人工智能·python