redisTemplate非阻塞删除批量前缀模糊匹配key

keys * 这个命令千万别在生产环境乱用。特别是数据庞大的情况下。因为Keys会引发Redis锁,并且增加Redis的CPU占用。
在生产环境中可以使用scan命令。

public void deleteRedisMd5Phone(){
		//设置需要删除的key前缀
        String key = "md5Phone";
        try {
            deleteKeysByScan(key)
        }catch (Exception e){
            log.error(e.getMessage());
        }
    }


    /**
     * 删除指定前缀的一系列key
     *
     * @param pattern 匹配keys的规则
     */
    public void deleteKeysByScan(String pattern) {
        long start = System.currentTimeMillis();
        log.info("清理redis{}key记录缓存的定时任务开始执行", pattern);
        String param = pattern + "*";
        int count = 0;
        while(true){
            long start1 = System.currentTimeMillis();
            log.info("第{}轮Redis删除开始",count);
            //设置每轮搜索到10W条数据 
            Set<String> keys = getValuesForStringByScan(param);
            count++;
            //找不到或者最多删除6千万条 可以自己设置
            if(keys.isEmpty()||count>600){
                break;
            }
            redisTemplate.delete(keys);
            log.info("第{}轮Redis删除开始,该轮执行了{}毫秒",count,(System.currentTimeMillis() - start1));

        }
        log.info("清理redis{}key记录缓存的定时任务执行结束,耗时:{}", pattern, (System.currentTimeMillis() - start));
    }

    /**
     * 获取匹配的所有key,使用scan避免阻塞
     *
     * @param patten 匹配keys的规则
     * @return 返回获取到的keys
     */
    public Set<String> getValuesForStringByScan(String patten) {
        Set<String> res = new HashSet<>();
        redisTemplate.execute(connect -> {
            Set<String> binaryKeys = new HashSet<>();
            Cursor<byte[]> cursor = connect.scan(new ScanOptions.ScanOptionsBuilder().match(patten).count(100000).build());
            while (cursor.hasNext() && binaryKeys.size() < 100000) {
                binaryKeys.add(new String(cursor.next()));
            }
            res.addAll(binaryKeys);
            return binaryKeys;
        }, true);
        return res;
    }


  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十番打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值