本文主要是介绍解决 Redis 击穿问题之黑名单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
以商品列表为例:
主要思想:
/* 1.先查黑名单是否存在当前商品,如果有就抛出异常 2.检查redis里面是否有该商品,如果有就直接返回, 3.如果没有就查询数据库,将数据缓存到redis 4.判断数据库中是否有该商品,如果有就直接返回,如果没有就将查询的数据放入黑名单中*/
代码示例:
@Resource(name = "redisTemplate")private HashOperations<String ,String,String> hashOperations;@Resource(name = "redisTemplate")private ValueOperations<String ,Product> valueOperations;//黑名单keyprivate static final String BLACK_LIST_KEY = "product.blacklist";//商品详情keyprivate static final String PRODUCT_DETAIL_KEY = "product.";public Product selectById(Integer id) {// 1.先查黑名单是否存在当前商品,如果有就抛出异常Boolean b = hashOperations.hasKey(BLACK_LIST_KEY, id.toString());if (b){log.error("商品被拉黑,已经存在黑名单中,id=》{}" ,id);throw new BizException(101,"商品被拉黑,已经存在黑名单中,id=》{}" + id);}//2.检查redis里面是否有该商品,如果有就直接返回,Product product = valueOperations.get(PRODUCT_DETAIL_KEY+id);if (ObjectUtil.isNotEmpty(product)){log.debug("redis里面有该商品,直接返回,id=》{}" ,id);return product;}//3.如果没有就查询数据库,将数据缓存到redisproduct = productDao.selectById(id);// 4.判断数据库中是否有该商品,如果有就直接返回,如果没有就将查询的数据放入黑名单中if (ObjectUtil.isNotEmpty(product)){log.debug("数据库中有该商品,直接返回,id=》{}" ,id);//为了防止雪崩,做错峰int i = RandomUtil.randomInt(-60,60);valueOperations.set(PRODUCT_DETAIL_KEY+id,product,24*60+i, TimeUnit.MINUTES);return product;}else {log.error("数据库中没有该商品,将查询的数据放入黑名单中,id=》{}" ,id);hashOperations.put(BLACK_LIST_KEY,id.toString(), DateUtil.now());throw new BizException(102,"商品不存在数据库中,id=》{}" + id);}}
这篇关于解决 Redis 击穿问题之黑名单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!