Redis 模糊查询key, SCAN、KEYS
keys
keys的操作会导致数据库暂时被锁住,其他的请求都会被堵塞;业务量大的时候会出问题
redisTemplate.keys(pattern + "*")
参考:https://blog.csdn.net/a774630093/article/details/102606343
redisTemplate.executeWithStickyConnection
/**
* 获得缓存的基本对象列表
*
* @param pattern 字符串前缀
* @param pageSize 分页大小
* @return 对象列表
*/
public List<String> scan(String pattern, int pageSize) {
List<String> result = new ArrayList<>();
try {
ScanOptions options = ScanOptions.scanOptions().count(pageSize).match(pattern+"*").build();
RedisSerializer<String> redisSerializer = redisTemplate.getKeySerializer();
Cursor cursor = (Cursor) redisTemplate.executeWithStickyConnection(redisConnection ->
new ConvertingCursor<>(redisConnection.scan(options), redisSerializer::deserialize));
result = JSON.parseObject(JSON.toJSONString(cursor), List.class);
//关闭cursor
cursor.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
使用spring-data-redis封装好的scan方法
redisConnection.scan
参考:https://note.dolyw.com/cache/10-Redis-Scan-Keys.html
public List<String> scan(String pattern) {
List<String> result = new ArrayList<>();
Cursor<byte[]> cursor = null;
try {
cursor = (Cursor) redisTemplate.execute((RedisCallback) redisConnection ->
redisConnection.scan(ScanOptions.scanOptions().match(pattern + "*").count(1000).build()));
while (cursor.hasNext()) {
result.add(new String(cursor.next()));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
try {
cursor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}