一、操作缓存和数据库时有三个问题需要考虑:
1.删除缓存还是更新缓存?
- 更新缓存:每次更新数据库都更新缓存,如果写多读少,这样效率太低。
- 删除缓存:更新数据的同时让缓存失效,查询时再更新缓存。
🌳我们一般会采用删除缓存策略。
2.如何保证缓存与数据库的操作同时成功或失效
- 单体系统,将缓存与数据库操作放在一个事务,利用事物本身原子性来保证。
- 分布式系统,利用TCC等分布式事务方案。
3.先操作缓存还是先操作数据库(多线程并发问题)
- 先删除缓存,在操作数据库
- 先操作数据库,在删除缓存
那哪一种比较好呢❓
解释:
如果在线程1删除缓存,更新数据库的时候,线程2查询该数据,未命中,然后写入缓存,这就导致了数据库与缓存不一致,并且这种情况发生的概率很大,因为更新的时间可能是比较久的,而操作缓存是很快的,所以这种方式不好
另一种方式
解释:
如果某一时刻,缓存突然失效了,线程1查询缓存未命中,准备写入缓存,这是线程2来更新数据库了,然后删除缓存,再然后线程1就要写入缓存了,数据又不一致了,但是这种情况发生的概率很小。
二、 缓存更新的最佳策略
主动更新缓存,并以超时剔除作为兜底方案,因为如果缓存过多可能导致内存不足
读操作:
- 缓存命中直接返回
- 未命中则查询数据库,并写入缓存,设定超时时间
写操作:
- 先操作数据库,然后再删除缓存
- 确保数据库和删缓存操作的一致性