获取方式:关注公众号,回复 面试手册;
小熊学Java在线网站:https://javaxiaobear.gitee.io/
业务场景:
PS:一般使用方案1,由缓存的调用者,在更新数据库的同时更新缓存
由缓存的调用者,在更新数据库的同时更新缓存
操作缓存和数据库时有三个问题需要考虑:
不存在线程安全问题场景
存在线程安全问题场景
不存在线程安全问题场景
存在线程安全问题场景
缓存更新策略的最佳实践方案:
@Override
public Result queryById(Long id) {
//从redis查询缓存
String key = RedisConstants.CACHE_SHOP_KEY + id;
String shopInfo = stringRedisTemplate.opsForValue().get(key);
//判断是否存在
if (StrUtil.isNotBlank(shopInfo)){
//存在则返回
Shop shop = JSONUtil.toBean(shopInfo, Shop.class);
return Result.ok(shop);
}
//不存在,则查询数据库
Shop shop = getById(id);
//不存在则返回错误
if (null == shop){
return Result.fail("店铺不存在");
}
//写入缓存 设置超时时间为30min
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);
//数据库存在,则返回
return Result.ok(shop);
}
@Override
@Transactional
public Result update(Shop shop) {
Long id = shop.getId();
if (null == id){
return Result.fail("店铺id不能为空");
}
//1.更新数据库
updateById(shop);
//2.删除缓存
stringRedisTemplate.delete(RedisConstants.CACHE_SHOP_KEY + shop.getId());
return Result.ok();
}
如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻
END
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有