Java管理系统拉黑相关功能的实现(放入redis,不用建表)

拉黑的话,我觉得是可以不写表的,只是个人理解,因为是不会出现高并发场景,所以我觉得就放入redis就足够了。

Controller层的代码:  

        在controller层接收到前端发送的参数,根据参数写出service层的业务代码逻辑

/*
    * 拉黑功能*/
    @RequestMapping(value = "/blacklist/{id}",method = RequestMethod.GET)
    public JSONResult blacklist(@PathVariable("id") Long id){
        messageSmsService.blacklist(id);
        return JSONResult.success();
    }
    /*
    * 查询黑名单功能*/

    @RequestMapping(value = "/selectblacklist",method = RequestMethod.POST)
    public JSONResult selectblacklist(@RequestBody MessageSmsQuery query){
        Page<MessageSms> page = new Page<MessageSms>(query.getPage(),query.getRows());
        page = messageSmsService.selectblacklist(page);
        return JSONResult.success(new PageList<MessageSms>(page.getTotal(),page.getRecords()));
    }


    /*
    * 移除黑名单功能*/
    @RequestMapping(value = "/removeblacklist/{id}",method = RequestMethod.GET)
    public JSONResult removeblacklist(@PathVariable("id") Long id){
        messageSmsService.removeblacklist(id);
        return JSONResult.success();
    }

 Service层(拉黑功能):

        通过id,拿到要拉黑的短信对象,里面有IP、电话、用户

        这里可以选择redis的Hash结构来写,传入三个参数

        再生成一个“blacklist:”+id的业务键,然后将ip,phone,userID放入redis的hash结构当中存储,并且要设置永不过期。

/*拉黑业务逻辑代码
    * */
    @Override
    public void blacklist(Long id) {
        MessageSms messageSms = messageSmsMapper.selectById(id);
        System.out.println(messageSms);
        String ip = messageSms.getIp();
        String phone = messageSms.getPhone();
        String userId = String.valueOf(messageSms.getUserId()); // 将userId转换为字符串
        // 假设RedisTemplate配置为使用String类型的键和值,可以根据需要调整序列化/反序列化来支持其他类型。
        HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();

        // 生成一个业务键,用于存储与特定id相关联的信息。
        String blacklistKey = "blacklist:" + id;

        // 将ip、phone和userId作为字段存储在Redis Hash中。
        hashOps.put(blacklistKey, "ip", ip);
        hashOps.put(blacklistKey, "phone", phone);
        hashOps.put(blacklistKey, "userId", userId);

        // 设置永不过期
        redisTemplate.persist(blacklistKey);

    }

 Service层(黑名单查询功能): 

        黑名单查询功能的话,用redisTemplate取出“blacklist”的所有key,然后创建ArrayList集合,遍历这个key,通过key截取到“blacklist”后面的值,然后取到id,查询出相应对象添加到ArrayList中      

/*
    黑名单查询
    * */
    @Override
    public Page<MessageSms> selectblacklist(Page<MessageSms> page) {
        Set<String> keys = redisTemplate.keys("blacklist:*");
        List<MessageSms> blacklistedIds = new ArrayList<>();
        for (String key : keys) {
            String idStr = key.substring("blacklist:".length());
            Long id = Long.parseLong(idStr);
            MessageSms messageSms = messageSmsMapper.selectById(id);
            blacklistedIds.add(messageSms);
        }

        // 将黑名单数据作为分页结果返回给前端
        Page<MessageSms> resultPage = new Page<>(page.getCurrent(), page.getSize());
        resultPage.setTotal(Long.parseLong(String.valueOf(blacklistedIds.size()))); // 将总记录数转换为字符串形式
        resultPage.setRecords(blacklistedIds);
        return resultPage;
    }

Service(移除黑名单):

        这里就是移除

/*移除黑名单逻辑代码
    * */
    @Override
    public void removeblacklist(Long id) {
        String blacklistKey = "blacklist:" + id;
        redisTemplate.delete(blacklistKey);
    }

Service层(重新查询 已经拉黑的短信)

        需要添加过滤信息,通过key来对比

//重写查询的方法,添加了过滤条件
    @Override
    public Page<MessageSms> selectPage(Page<MessageSms> page, Wrapper<MessageSms> wrapper) {

        Page<MessageSms> messageSmsPage = super.selectPage(page, wrapper);
        List<MessageSms> records = messageSmsPage.getRecords();

        ArrayList<MessageSms> filteredData = new ArrayList<>();
        for (MessageSms message : records) {
            Long id = message.getId();
            String blacklistKey = "blacklist:" + id;
            if (!redisTemplate.opsForHash().hasKey(blacklistKey, "ip")) {
                // 该条数据不在黑名单中,将其添加到过滤后的列表中
                filteredData.add(message);
            }
        }
        // 更新查询结果的数据列表为过滤后的列表
        messageSmsPage.setRecords(filteredData);
        return messageSmsPage;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值