Springboot中的redis用scan代替keys命令

生产环境一般会屏蔽掉keys命令,但是有时会用到这个命令,比如刷新缓存,会把相同特定前缀的key都删除掉,如果没有keys命令,怎么进行删除呢?

通过Cursor获取要删除的key,例如key的前缀是xxx:prefix:xxx:

1
2
3
4
5
6
7
8
9
ScanOptions options = ScanOptions.scanOptions().match("xxx:prefix:xxx:*").count(1000)
.build();
Cursor<String> cursor = (Cursor<String>) redisTemplate.executeWithStickyConnection(
redisConnection -> new ConvertingCursor<>(redisConnection.scan(options),
redisTemplate.getKeySerializer()::deserialize));

cursor.forEachRemaining(key -> {
redisTemplate.delete(key);
});

.count(1000)中的1000是步进值,过小效率会低一些,尽量与数据级匹配些。
redisTemplate.delete(key);这部分可以替换成自己的代码,可以删除,也可以进行一些别的操作


Springboot中的redis用scan代替keys命令
https://wangqianying.com/2019/12/19/2019-12-19-spring-boot-redis-scan/
作者
wang fei
发布于
2019年12月19日
许可协议