这里有两种方式,一种简单直接的方式 适用于数据少的,一种复杂的方式 适用于数据量大且求稳的
话不多说直接上代码了:
第一种:
/*
这里返回值你可以任选,可以选择返回List<String>,里面放value值,我这里就key、value都存,用Map.Entry来存了
传参—— 1:redis客户端,我这里使用RedisTemplate,2:模糊匹配字符串
*/
public List<Map.Entry<String, Object>> searchHashKeys(RedisTemplate<String, Object> redisTemplate, String pattern) {
//创建一个List存放最终结果集
List<Map.Entry<String, Object>> result = new ArrayList<>();
//使用 ScanOptions.scanOptions().match()方法来模糊搜索, "*"+字符串+"*"匹配开头、结尾、中间包含的
redisTemplate.execute((RedisCallback<List<Object>>) connection -> {
ScanOptions options = ScanOptions.scanOptions().match("*" + pattern + "*").build();
//创建一个结果集
ScanResult<byte[]> scanResult;
byte[] cursor = ScanParams.SCAN_POINTER_START_BINARY;
//使用 do while 循环来获取结果
do {
//my-hash 是我redis存储hash数据类型的key,替换成你定义的key即可
scanResult = connection.hScan("my-hash".getBytes(), cursor, options);
//获取结果集
List<Map.Entry<byte[], byte[]>> entryList = scanResult.getResult();
//循环获取每一条key、value,并存入创建的list集合中
for (Map.Entry<byte[], byte[]> entry : entryList) {
String key = new String(entry.getKey());
String value = new String(entry.getValue());
result.add(new AbstractMap.SimpleEntry<>(key, value));
}
cursor = scanResult.getCursorAsBytes();
//直到所有hash遍历完成
} while (scanResult.getCursor() > 0);
return null;
});
return result;
}
第二种方式:
/*
这里返回值你可以任选,可以选择返回List<String>,里面放value值,我这里就key、value都存,用Map.Entry来存了
入参同样是 RedisTemplate客户端 和 需要模糊匹配的字符串
*/
public List<Map.Entry<String, Object>> searchHashKeys(RedisTemplate<String, Object> redisTemplate, String pattern) {
//创建一个List存放结果集
List<Map.Entry<String, Object>> result = new ArrayList<>();
//获取 hash中的每一个key值 这里的my-hash是我Redis存放数据的key
Set<Object> objectKey= redisTemplate.opsForHash().keys("my-hash");
//我这里的key是一个String类型,所以我要给Set<Object>转成Set<String>
Set<String>keys=objectKey.stream().map(Object::toString).collect(Collectors.toSet());
//循环Set集合
for (String key : keys) {
//判断如果包含字符串就收集key、value
if (key.contains(pattern)) {
String value = (String) redisTemplate.opsForHash().get("my-hash", key);
result.add(new AbstractMap.SimpleEntry<>(key, value));
}
}
return result;
}