redis中 scan实现模糊查询
一、scan前言从Redis v2.8开始,scan命令已经可用,它允许使用游标从keyspace中检索键。对比keys命令,虽然scan无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。二.scan相关命令scan相关命令包括sscan 命令、hscan 命令和 zscan 命令,分别用于集合、哈希键及有续集等。scan 命令用于迭代当前数据库中的
·
一、scan前言
从Redis v2.8开始,scan命令已经可用,它允许使用游标检索键。
对比keys命令,虽然scan无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。
二.scan相关命令
scan相关命令包括sscan 命令、hscan 命令和 zscan 命令,分别用于集合、哈希键及有续集等。
scan 命令用于迭代当前数据库中的数据库键。
sscan 命令用于迭代集合键中的元素。
hscan 命令用于迭代哈希键中的键值对。
zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
因为 scan 、 sscan 、 hscan 和 zscan 四个命令的工作方式都非常相似, 要记住:
sscan 命令、 hscan 命令和 zhscan 命令的第一个参数总是一个数据库键。
而 scan 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。
三.基本用法:
命令格式:
scan cursor match pattern] [count count]
命令解释:scan 游标 match <返回和给定模式相匹配的元素> count 每次迭代所返回的元素数量
scan 命令是增量的循环,每次调用只会返回一小部分的元素。所以不会有 keys 命令的坑(key的数量比较多,一次keys查询会block其他操作)。
scan命令返回的是一个游标,从0开始遍历,到0结束遍历。
通过scan中的match <pattern> 参数,可以让命令只返回和给定模式相匹配的元素,实现模糊查询的效果
示例:
示例:
scan 0 match DL* count 5
sscan myset 0 match f*
四、SCAN命令:Jedis用法:
@Test
public void testScan() {
// 创建一个jedis的对象。
Jedis jedis = new Jedis("192.168.112.65", 6379);
jedis.auth("zhifu123");
// 调用jedis对象的方法,方法名称和redis的命令一致。
ScanParams scanParams = new ScanParams();
scanParams.match("DL*");
scanParams.count(5);
jedis.select(1);
// scan(curso,params) cursor 表示开始遍历的游标 params 是ScanParams 对象,此对象可以设置 每次返回的数量,以及遍历时的正则表达式
// 需要注意的是,对元素的模式匹配工作是在命令从数据集中取出元素之后,向客户端返回元素之前的这段时间内进行的,
// 所以如果被迭代的数据集中只有少量元素和模式相匹配,那么迭代命令或许会在多次执行中都不返回任何元素。
ScanResult<String> scan = jedis.scan("0", scanParams);
System.out.println("scan:返回用于下次遍历的游标"+scan.getStringCursor());
System.out.println("scan:返回结果"+scan.getResult());
// 关闭jedis。
jedis.close();
}
根据某个字段模糊搜索 Redis 中的某个 key
public String searchTokenFirst(String key) {
//execute():搜索 Redis 中某个 key
Cursor<byte[]> cursor =
redisTemplate.execute((RedisCallback<Cursor<byte[]>>) connection ->
connection.scan(ScanOptions.scanOptions().match("*" + key + "*").build()));
//将 redis scan 迭代的结果的第一条转为字符串
if (cursor.hasNext()) {
return new String(cursor.next());
}
return null;
}
更多推荐
已为社区贡献9条内容
所有评论(0)