redis中 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;
    }

Guess you like

Origin blog.csdn.net/m0_37899908/article/details/118852654