redis分布式缓存(十八)一一 黑名单校验器解决方案
一、黑名单过滤器业务场景分析
在一些电商系统,如淘宝的评价功能,不是任何人都可以评价,只能是购买了商品的,并且有良好的评价记录的才能评价审核通过,有一种职业就是差评师,差评师就是勒索敲诈商家,这种差评师在淘宝里面就被设置了黑名单,即使购买了商品,也评价不了。
二、黑名单校验器的redis技术方案
黑名单过滤器的应用场景很多,如设备黑名单,ip黑名单,用户黑名单等等
电商系统中,高并发的情况下,通过查询数据库过滤明显不符合要求,通用的做法都是通过Redis的set结构来实现的。
步骤1:同步数据,先把数据库的数据同步到redis的set集合中。
步骤2:查询过滤,评价的时候验证是否在黑名单,通过redis的sismember命令来实现。
三、SpringBoot+Redis实现黑名单校验器
步骤1:初始化数据到redis缓存中
/** * 初始化数据到redis缓存中 */ @PostConstruct public void init(){ List<Integer> blacklist=this.blacklist(); blacklist.forEach(t->this.redisTemplate.opsForSet().add(Constants.BLACKLIST_KEY,t)); } /** * 模拟500个黑名单 */ public List<Integer> blacklist() { List<Integer> list=new ArrayList<>(); for (int i = 0; i < 500; i++) { list.add(i); } return list; } 复制代码
步骤2:编写黑名单校验器接口
/** *黑名单校验器接口 * true=黑名单 * false=不是黑名单 */ @GetMapping(value = "/isBlacklist") public boolean isBlacklist(Integer userId) { boolean bo=false; try { //到set集合中去校验是否黑名单, bo = this.redisTemplate.opsForSet().isMember(Constants.BLACKLIST_KEY,userId); log.info("查询结果:{}", bo); } catch (Exception ex) { //这里的异常,一般是redis瘫痪 ,或 redis网络timeout log.error("exception:", ex); //TODO 走DB查询 } return bo; }
作者:小伙子vae
链接:https://juejin.cn/post/7031469771749228581