Redis Key的模糊查询

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

话不多说直接上代码了:

第一种:

/*
这里返回值你可以任选,可以选择返回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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值