Redis的数据不可能是一成不变的,因此本节讲一下Redis的缓存更新策略
内存淘汰 | 超时剔除 | 主动更新 | |
---|---|---|---|
说明 | 当内存不足时自动淘汰部分数据。下次查询时更新缓存。 | 添加TTL时间,到期后自动删除缓存。 | 在修改数据库的同时,更新缓存。 |
一致性 | 差 | 一般 | 好 |
维护成本 | 无 | 低 | 高 |
业务场景:
删除缓存还是更新缓存? 更新缓存:每次更新数据库都更新缓存,无效写操作较多 删除缓存:更新数据库时让缓存失效,查询时再更新缓存(👍)
如何保证缓存与数据库的操作的同时成功或失败?(暂不考虑) 单体系统,将缓存与数据库操作放在一个事务 分布式系统,利用TCC等分布式事务方案
先操作缓存还是先操作数据库?
先删除缓存,再操作数据库 先操作数据库,再删除缓存(👍)
但是总的来说操作数据库时间>写入缓存的时间。还是先操作数据库,再操作缓存好。
@Override
@Transactional
public void updateShopById(Shop shop) {
// 1. 更新数据库
this.updateById(shop);
// 2. 删除缓存
stringRedisTemplate.delete(CACHE_SHOP_KEY + shop.getId());
}