目录
添加缓存
代码实现
主动更新缓存
先删缓存在操作数据库
数据一致
数据不一致
先操作数据库在删除缓存
数据一致
数据不一致
总结
添加缓存
代码实现
public Shop queryWithPassThtough(Long id){
//先从redis中查询缓存
String object = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);
//如果有直接返回
if(object != null){
//转成Java对象
Shop bean = JSONUtil.toBean(object, Shop.class);
return bean;
}
//如果没有,查询数据库
Shop shop = this.getById(id);
//如果数据库中没有,报错
if (shop == null){
return Result.fail("没有该店铺");
return null;
}
//如果有,写入redis
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,JSONUtil.toJsonStr(shop),30, TimeUnit.MINUTES);
return shop;
}
主动更新缓存
先删缓存在操作数据库
数据一致
假设线程A先删除缓存然后操作数据库,此时线程B来查询缓存没有命中,然后从数据库查询到数据后写入缓存此时缓存与数据库数据一致
数据不一致
假设A线程先删除缓存,此时线程B来查询缓存未命中,就会查询数据库(旧数据)并写入缓存,此时数据库与缓存的数据不一致
先操作数据库在删除缓存
数据一致
数据不一致
总结
不论是先删除缓存还是先操作数据库,都要确保更新数据库的操作在查询缓存之前,这样才能保证数据一致