使用redisTemplate的scan方式删除批量key问题
作者:bat在等我
这篇文章主要介绍了使用redisTemplate的scan方式删除批量key问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
redisTemplate的scan方式删除批量key
/** * 删除指定前缀的一系列key * * @param pattern 匹配keys的规则 */ public void deleteKeysByScan(String pattern) { long start = System.currentTimeMillis(); LOGGER.error("清理{}类外呼记录缓存的定时任务开始执行", pattern); String param = pattern + "*"; Set<String> keys = this.getValuesForStringByScan(param); redisTemplate.delete(keys); LOGGER.error("清理{}类外呼记录缓存的定时任务执行结束,耗时:{}", pattern, (System.currentTimeMillis() - start)); } /** * 获取匹配的所有key,使用scan避免阻塞 * * @param patten 匹配keys的规则 * @return 返回获取到的keys */ public Set<String> getValuesForStringByScan(String patten) { return redisTemplate.execute(connect -> { Set<String> binaryKeys = new HashSet<>(); Cursor<byte[]> cursor = connect.scan(new ScanOptions.ScanOptionsBuilder().match(patten).count(200000).build()); while (cursor.hasNext() && binaryKeys.size() < 200000) { binaryKeys.add(new String(cursor.next())); } return binaryKeys; }, true); }
Java使用RedisTemplate模糊删除key
Redis模糊匹配批量删除操作,使用RedisTemplate操作:
public void deleteByPrex(String prex) { Set<String> keys = redisTemplate.keys(prex); if (CollectionUtils.isNotEmpty(keys)) { redisTemplate.delete(keys); } }
prex为迷糊匹配的key,如cache:user:*
这里需要判断keys是否存在,如果一个都匹配不到会报错:
ERR wrong number of arguments for 'del' command
当然,如果要直接在linux里面操作的话,在命令行执行以下命令:
redis-cli keys "keys" | xargs redis-cli del
keys 是要匹配的规则,和上面的prex一样。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。