黑马点评技术汇总(三)缓存穿透
缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在这样缓存永远不会生效这些请求都会打到数据库。缓存空对象常用方案当没有命中redis时并且查询数据库也为空那我们不返回404而是返回一个空对象存储在redis中并设置一个TTL防止频繁访问数据库。主动措施1.增强id的复杂度避免被猜测id规律2.做好数据的基础格式校验3.加强用户权限校验4.做好热点参数的限流下面我们就根据这个方案修改原先的缓存方案我们在原来的基础上当商铺不存在时将空值写入redis并且在缓存校验时判断是否为空值如果是就直接返回错误信息不是就返回商户信息Service public class ShopServiceImpl extends ServiceImplShopMapper, Shop implements IShopService { Resource private StringRedisTemplate stringRedisTemplate; /** * 根据id查询商铺信息 */ Override public Result queryById(Long id) { //从redis查缓存 String key CACHE_SHOP_KEY id; String shopJson stringRedisTemplate.opsForValue().get(key); //判断是否存在 if(StrUtil.isNotBlank(shopJson)){ //存在直接返回 Shop shop JSONUtil.toBean(shopJson, Shop.class); return Result.ok(shop); } //判断命中是否为空值 if(shopJson!null){ return Result.fail(店铺不存在); } //不存在根据id查询数据库 Shop shop getById(id); if(shop null){ //不存在将控制写入redis stringRedisTemplate.opsForValue().set(key,,CACHE_NULL_TTL, TimeUnit.MINUTES); return Result.fail(商铺不存在); } //存在写入redis stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES); //返回商铺信息 return Result.ok(shop); } /** * 更新商铺信息 * param shop */ Transactional Override public Result update(Shop shop) { Long id shop.getId(); if(idnull){ return Result.fail(商铺id不能为空); } String key CACHE_SHOP_KEY id; //更新数据库 updateById(shop); //删除缓存 stringRedisTemplate.delete(key); return Result.ok(shop); } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2448133.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!