缓存与数据库读写模式
- 读数据时先读缓存,如果缓存中有数据直接响应,如果没有数据,查询数据库,写入缓存,同时响应
- 写数据时,先写入数据库,并删除缓存
为什么写数据时删除缓存而不是更新缓存?
如果这个数据写多读少,频繁的更新缓存反而会造成资源浪费,删除缓存则采用了懒加载的思想。
缓存失效模式存在的问题
如果多个线程同时在缓存过期时访问数据库请求数据,由于种种状况的可能(比如一个线程先访问到数据库,但是在取数据时卡住了,另一个线程访问到数据库,取到数据放入缓存,这时前一个线程刚取到数据,又把更新的缓存给覆盖掉了),可能导致缓存和数据库数据不一致的问题。
如何保证缓存与数据库数据一致性
核心是在缓存过期时,所有微服务只能有一个请求访问数据库。
另外,如果数据的一致性要求不是非常严格,即使在短时间内存在数据不一致的情况,只要设置了缓存过期时间,每隔一段时间会自动更新到最新数据,不影响实际业务也可。
Redisson分布式锁
public Map<String, List<Vo>> getJsonFromDBWithRedissonLock() {
// 1、占分布式锁,去reids占坑
RLock lock = redisson.getLock("Json-lock");
lock.lock(); // 阻塞等待
// 加锁成功...执行业务
Map<String, List<Vo>> dataFromDB;
try {
// 访问数据库
dataFromDB = getJSONDataFromDB();
} finally {
lock