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

本文讨论了操作缓存和数据库时遇到的三个关键问题:选择删除缓存还是更新,保证操作同步,以及并发时的顺序。提出主动更新缓存策略,并强调在多线程环境下避免数据不一致的方法。
摘要由CSDN通过智能技术生成

目录

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

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

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

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

二、 缓存更新的最佳策略


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

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

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

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

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

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

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

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

那哪一种比较好呢❓

解释:

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

另一种方式

 

解释:

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

二、 缓存更新的最佳策略

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

读操作:

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

写操作:

  • 先操作数据库,然后再删除缓存
  • 确保数据库和删缓存操作的一致性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会就选C.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值