Redis Key的模糊查询

这里有两种方式,一种简单直接的方式 适用于数据少的,一种复杂的方式 适用于数据量大且求稳的

话不多说直接上代码了:

第一种:

/*
这里返回值你可以任选,可以选择返回List,里面放value值,我这里就key、value都存,用Map.Entry来存了

传参—— 1:redis客户端,我这里使用RedisTemplate,2:模糊匹配字符串

*/
public List> searchHashKeys(RedisTemplate redisTemplate, String pattern) {

    //创建一个List存放最终结果集
    List> result = new ArrayList<>();
     //使用   ScanOptions.scanOptions().match()方法来模糊搜索, "*"+字符串+"*"匹配开头、结尾、中间包含的
    redisTemplate.execute((RedisCallback>) connection -> {
        ScanOptions options = ScanOptions.scanOptions().match("*" + pattern + "*").build();
        //创建一个结果集
        ScanResult 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> entryList = scanResult.getResult();
            //循环获取每一条key、value,并存入创建的list集合中
            for (Map.Entry 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,里面放value值,我这里就key、value都存,用Map.Entry来存了

入参同样是 RedisTemplate客户端 和 需要模糊匹配的字符串
*/
public List> searchHashKeys(RedisTemplate redisTemplate, String pattern) {

    //创建一个List存放结果集
    List> result = new ArrayList<>();
    //获取 hash中的每一个key值     这里的my-hash是我Redis存放数据的key
    Set objectKey= redisTemplate.opsForHash().keys("my-hash");
    //我这里的key是一个String类型,所以我要给Set转成Set
    Setkeys=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;
} 
  

你可能感兴趣的:(Java,redis,缓存,java)