我正在尝试使用 SCAN http://redis.io/commands/scan来遍历 redis 中存在的所有键。但是spring提供的Redis模板没有scan()方法。使用上述方法有什么技巧吗?
谢谢
我正在尝试使用 SCAN http://redis.io/commands/scan来遍历 redis 中存在的所有键。但是spring提供的Redis模板没有scan()方法。使用上述方法有什么技巧吗?
谢谢
您可以使用RedisCallback
onRedisOperations
来执行此操作。
redisTemplate.execute(new RedisCallback<Iterable<byte[]>>() {
@Override
public Iterable<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
List<byte[]> binaryKeys = new ArrayList<byte[]>();
Cursor<byte[]> cursor = connection.scan(ScanOptions.NONE);
while (cursor.hasNext()) {
binaryKeys.add(cursor.next());
}
try {
cursor.close();
} catch (IOException e) {
// do something meaningful
}
return binaryKeys;
}
});
Set<String> keys = (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Cursor<byte[]> cursor = null;
Set<String> keysTmp = new HashSet<>();
try {
cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(keyPrefix + "*").count(10000).build());
while (cursor.hasNext()) {
keysTmp.add(new String(cursor.next()));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (Objects.nonNull(cursor) && !cursor.isClosed()) {
try {
cursor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return keysTmp;
});