1.概述
读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。
- 案例:
同时有一个请求 A 进行更新操作,一个请求 B 进行查询操作。可能出现:
(1)请求 A 进行写操作(key = 1value = 2),先删除缓存 key = 1value = 1
(2)请求 B 查询发现缓存不存在
(3)请求 B 去数据库查询得到旧值 key = 1 value = 1
(4)请求 B 将旧值写入缓存 key = 1 value = 1
(5)请求 A 将新值写入数据库 key = 1 value = 2
问题:缓存中数据永远都是脏数据
解决(双删策略):先删除缓存,再更新数据库,再删缓存(双删,第二次删可异步延时)
- 代码实现
public Provinces update(Provinces entity) {
redisTemplate.delete(entity.getProvinceid());//直接删除缓存,预防数据库成功,缓存失败
super.update(entity);
redisTemplate.delete(entity.getProvinceid());//双删
return entity;
}
2.问题和解决
-
缓存过期与一致性问题
image.png -
解决方案对比
image.png
网友评论