redis模糊查询键值对
1.要模糊查询redis中的key
方法一:使用scan命令(推荐)
scan cursor [MATCH pattern] [COUNT count]
- cursor:表示游标,从“0”开始,此命令执行完后会返回一个新的cursor值。如果cursor!="0",则表示还有key未返回,需要再调用scan,并使用此新的cursor值,来获取下一批key;如果cursor=="0",则表示遍历结束。
- pattern:表示模糊匹配的样式
- count:表示一批最多返回多少条记录,默认为10
注: keys pattern里面有3个通配符 分别是 *,?,[]
*:通配多个任意字符
?:通配单个字符
[]:通配数组内的某个字符
java实现:
do {
ScanParams scanParams = new ScanParams();
//*表示匹配任意数量的任意字符
scanParams.match("xxxx*");
scanParams.count(10);
ScanResult sr = jedis.scan(cursor, scanParams);
List resultList = sr.getResult();
for (String result : resultList) {
System.out.println("key: " + result);
//对key的操作,或者先放到一个集合里面,然后再进行后续操作
}
cursor = sr.getStringCursor();
System.out.println("cursor: " + cursor);
} while (!cursor.equals("0"));
方法二:keys 指令 (只适合在测试环境中使用,不适合在生产环境中使用,原因是redis是单线程运行的,当redis中的数据量很大时,由于此操作会遍历所有数据,并将结果一次性全部返回,执行时间会比较长,从而导致后续操作等待,直接影响系统的正常运行)
@Autowired private RedisTemplate redisTemplate; public void getKey() { long start = System.currentTimeMillis(); redisTemplate.keys("cart*"); long end = System.currentTimeMillis(); System.out.println(end - start); RedisConnection connection = RedisConnectionUtils.getConnection(redisTemplate.getConnectionFactory()); Cursor<byte[]> result = connection.scan(new ScanOptions.ScanOptionsBuilder().count(10).match("cart*").build()); long start1 = System.currentTimeMillis(); //cursor有id和position这两个属性,id则对应 scan cursor 的cursor的值,poisition则是当前遍历到第几个 while (result.hasNext()) {//这里可以改用for循环来获取指定数量的key String key=new String(result.next()); //对key的操作,或者先放到一个集合里面,然后再进行后续操作 } long end1 = System.currentTimeMillis(); System.out.println(end1 - start1); }
结束