zoukankan      html  css  js  c++  java
  • Redis命令:scan实现模糊查询

    转;

    Redis命令:scan实现模糊查询

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fly910905/article/details/78942357

    1.scan前言

    从Redis v2.8开始,SCAN命令已经可用,它允许使用游标从keyspace中检索键。
    对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。

    2.SCAN相关命令

    • SCAN相关命令包括SSCAN 命令、HSCAN 命令和 ZSCAN 命令,分别用于集合、哈希键及有续集等

    SCAN 命令用于迭代当前数据库中的数据库键。
    SSCAN 命令用于迭代集合键中的元素。
    HSCAN 命令用于迭代哈希键中的键值对。
    ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

    • 因为 SCAN 、 SSCAN 、 HSCAN 和 ZSCAN 四个命令的工作方式都非常相似, 要记住:

    SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。

    而 SCAN 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。

    3.基本用法:

    命令格式:

    SCAN cursor [MATCH pattern] [COUNT count]


    命令解释:scan 游标 MATCH <返回和给定模式相匹配的元素> count 每次迭代所返回的元素数量


    SCAN命令是增量的循环,每次调用只会返回一小部分的元素。所以不会有KEYS命令的坑(key的数量比较多,一次KEYS查询会block其他操作)。  
    SCAN命令返回的是一个游标,从0开始遍历,到0结束遍历。
    通过scan中的MATCH <pattern> 参数,可以让命令只返回和给定模式相匹配的元素,实现模糊查询的效果

    1. 示例:
    2. scan 0 match DL* count 5
    3. sscan myset 0 match f*

    SCAN命令:Jedis用法:

    1. @Test
    2. public void testScan() {
    3. // 创建一个jedis的对象。
    4. Jedis jedis = new Jedis("192.168.112.65", 6379);
    5. jedis.auth("zhifu123");
    6. // 调用jedis对象的方法,方法名称和redis的命令一致。
    7. ScanParams scanParams = new ScanParams();
    8. scanParams.match("DL*");
    9. scanParams.count(5);
    10. jedis.select(1);
    11. // scan(curso,params) cursor 表示开始遍历的游标 params 是ScanParams 对象,此对象可以设置 每次返回的数量,以及遍历时的正则表达式
    12. // 需要注意的是,对元素的模式匹配工作是在命令从数据集中取出元素之后,向客户端返回元素之前的这段时间内进行的,
    13. // 所以如果被迭代的数据集中只有少量元素和模式相匹配,那么迭代命令或许会在多次执行中都不返回任何元素。
    14. ScanResult<String> scan = jedis.scan("0", scanParams);
    15. System.out.println("scan:返回用于下次遍历的游标"+scan.getStringCursor());
    16. System.out.println("scan:返回结果"+scan.getResult());
    17. // 关闭jedis。
    18. jedis.close();
    19. }

    4.返回值:

    SCAN 命令、 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都返回一个包含两个元素的 multi-bulk 回复: 

    • 回复的第一个元素是字符串表示的无符号 64 位整数(游标)

    SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
    当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。

    • 回复的第二个元素是另一个 multi-bulk 回复

    这个 multi-bulk 回复包含了本次被迭代的元素。

    注意:SCAN命令不能保证每次返回的值都是有序的,另外同一个key有可能返回多次,不做区分,需要应用程序去处理。

    SCAN 命令返回的每个元素都是一个数据库键。
    SSCAN 命令返回的每个元素都是一个集合成员。
    HSCAN 命令返回的每个元素都是一个键值对,一个键值对由一个键和一个值组成。
    ZSCAN 命令返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。

    参考来源: http://redisdoc.com/key/scan.html#scan

  • 相关阅读:
    对 Spring IoC 的理解
    初识 Spring 框架
    CSS 全局样式
    Bootstrap 12 栅格系统
    551 闭包,浏览器垃圾回收机制/内存收机制
    550 JavaScript运行机制之“堆栈”
    549 数据类型转换汇总:转换为Number、字符串、布尔,比 较操作==、===,练习题
    547 Promise:Ajax 的串行、并行, Promise的executor和状态,then、catch、finally,then链
    546 变量提升
    545 parseInt解析
  • 原文地址:https://www.cnblogs.com/libin6505/p/10694492.html
Copyright © 2011-2022 走看看