解决spring中redistemplate不能用通配符keys查出相应Key的问题

网友投稿 1006 2023-03-08

解决spring中redistemplate不能用通配符keys查出相应Key的问题

解决spring中redistemplate不能用通配符keys查出相应Key的问题

有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除。

但是在keys(patten+"*")时每次取出的都为空。

解决问题:

spring中redis配置中,引入StringRedisTemplate而不是RedisTemplate,StringRedisTemplate本身继承自RedisTemplate,

改为

补充知识:RedisTemplate使用SCAN命令扫描key替代KEYS避免redis服务器阻塞,无坑!完美解决方案

话不多说先上代码,拿走即用。

long start = Systehttp://m.currentTimeMillis();

//需要匹配的key

StXerQDQring patternKey = "pay:*";

ScanOptions options = ScanOptions.scanOptions()

//这里指定每次扫描key的数量(很多博客瞎说要指定Integer.MAX_VALUE,这样的话跟 keys有什么区别?)

.count(10000)

.match(patternKey).build();

RedisSerializer redisSerializer = (RedisSerializer) redisTemplate.getKeySerializer();

Cursor cursor = (Cursor) redisTemplate.executeWithStickyConnection(redisConnection -> new ConvertingCursor<>(redisConnection.scan(options), redisSerializer::deserialize));

List result = new ArrayList<>();

while(cursor.hasNext()){

result.add(cursor.next().toString());

}

//切记这里一定要关闭,否则会耗尽连接数。报Cannot get Jedis connection; nested exception ishttp:// redis.clients.jedis.exceXerQDQptions.JedisException: Could not get a

cursor.close();

log.info("scan扫描共耗时:{} ms key数量:{}",System.currentTimeMillis()-start,result.size());

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小娱头条是什么程序插件(小娱头条是什么程序插件啊)
下一篇:虚幻移动端怎么在小程序运行(怎么使用虚幻引擎)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~