redis分布式缓存(十八)一一 黑名单校验器解决方案

黑名单校验器解决方案

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

一、黑名单过滤器业务场景分析

在一些电商系统,如淘宝的评价功能,不是任何人都可以评价,只能是购买了商品的,并且有良好的评价记录的才能评价审核通过,有一种职业就是差评师,差评师就是勒索敲诈商家,这种差评师在淘宝里面就被设置了黑名单,即使购买了商品,也评价不了。

二、黑名单校验器的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;
}
复制代码

redis分布式缓存系列

おすすめ

転載: juejin.im/post/7031469771749228581