欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring redis 如何实现模糊查找key

程序员文章站 2022-06-25 15:22:24
spring redis 模糊查找key用法set keyset = stringredistemplate.keys("keyprefix:"+"*"); 需要使用...

spring redis 模糊查找key

用法

set<string> keyset = stringredistemplate.keys("keyprefix:"+"*");
  • 需要使用stringredistemplate,或自定义keyserializer为stringredisserializer的redistemplate
  • redis里模糊查询key允许使用的通配符:

     * 任意多个字符

     ? 单个字符

     [] 括号内的某1个字符

源码

org.springframework.data.redis.core.redistemplate
public set<k> keys(k pattern) {
 byte[] rawkey = rawkey(pattern);
 set<byte[]> rawkeys = execute(connection -> connection.keys(rawkey), true);
 return keyserializer != null ? serializationutils.deserialize(rawkeys, keyserializer) : (set<k>) rawkeys;
}

改善

  • redis2.8以后可以使用scan获取key
  • 基于游标迭代分次遍历key,不会一次性扫描所有key导致性能消耗过大,减少服务器阻塞

可以通过count参数设置扫描的范围

set<string> keys = new linkedhashset<>();
stringredistemplate.execute((redisconnection connection) -> {
    try (cursor<byte[]> cursor = connection.scan(
            scanoptions.scanoptions()
                    .count(long.max_value)
                    .match(pattern)
                    .build()
    )) {
        cursor.foreachremaining(item -> {
            keys.add(redisserializer.string().deserialize(item));
        });
        return null;
    } catch (exception e) {
        throw new runtimeexception(e);
    }
});

reids scan命令官方文档

redis-redistemplate模糊匹配删除

 string key = "noteuserlistenedpoi:*";
            redistemplate.delete(key);
            logger.info("redis中用户收听历史被清空");

后来测试发现模糊查询是可以用的, 删除改成

set<string> keys = redistemplate.keys("noteuserlistenedpoi:" + "*");
            redistemplate.delete(keys);
            logger.info("{}, redis中用户收听历史被清空"

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。