spring redis 如何实现模糊查找key
程序员文章站
2022-03-25 14:49:18
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); } });
redis-redistemplate模糊匹配删除
string key = "noteuserlistenedpoi:*"; redistemplate.delete(key); logger.info("redis中用户收听历史被清空");
后来测试发现模糊查询是可以用的, 删除改成
set<string> keys = redistemplate.keys("noteuserlistenedpoi:" + "*"); redistemplate.delete(keys); logger.info("{}, redis中用户收听历史被清空"
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。