1. 缓存更新策略综述
- 内存淘汰
- 不用自己维护,利用 Redis 自己的内存淘汰机制 (内存不足时,触发策略,默认开启,可自己配置),其可在一定程度上保持数据一致性
- 超时剔除
- 给数据添加 TTL,到期之后自动剔除,是最终一致性
- 自动更新
- 编写业务逻辑,修改数据库时,更新缓存,一致性高,维护成本高
2. 缓存策略的选择
选择内存策略,要基于业务场景 —— 低一致性需求,高一致性需求
2. 主动更新策略
缓存的主动更新策略又分为以下三种:
3. Cache Aside Pattern
Cache Aside Patter 是我们比较常用的缓存更新策略,其由缓存调用者在更新数据库时,在业务逻辑中设置缓存更新。对 Cache Aside Pattern ,有以下三个问题比较重要。
- 是删除缓存还是更新缓存?
使用更新数据库时删除缓存,下次读数据的时候再写入缓存的策略,更新缓存会产生很多不必要的写操作。 - 如何保证缓存与数据库的操作的同时成功或者失败
在单体项目中很好控制,在分布式项目中,使用分布式事务解决。 - 先操作缓存还是先操作数据库
线程问题:使用先操作数据库,再删除缓存。先操作数据库再操作缓存,能减少发生问题的概率。
如下是两种线程不安全问题产生的场景,但是因为缓存的操作数据的速度是远远高于数据库写操作的速度的,因此先操作数据库再删除缓存,出现问题的可能性低。
4.代码实现
在更新代码中,加入删除缓存的逻辑即可,代码示例如下:
@Override
public Result update(Shop shop) {
if(shop == null){
return Result.fail("店铺不能为 null");
}
// 更新数据库
updateById(shop);
// 删除缓存
stringRedisTemplate.delete(CACHE_SHOP_KEY + shop.getId());
return Result.ok();
}