Redis命令:scan实现模糊查询

1.前言

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

使用场景:想把Redis的内容全量扫描导入到MySQL。

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> 参数,可以让命令只返回和给定模式相匹配的元素,实现模糊查询的效果 示例:

scan 0 match DL* count 5 
sscan myset 0 match f*
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();
    }

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)组成。

原文发布于微信公众号 - 编码前线(gh_acef1225aadd)

原文发表时间:2018-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使...

22260
来自专栏生信宝典

Bash概论 - Linux系列教程补充篇

本篇是我最开始学习Linux命令时看的一篇帖子,最早见于ChinaUnix (这次查找其出处时发现2002年就有这篇)。学习过程中,遇到问题就查一下。这次看到,...

20670
来自专栏技术博文

php面试题整理

1.禁用COOKIE 后 SEESION 还能用吗? 答:通常服务器端的session是借助于seesion cookie来和客户端交互的。 但如果客户端禁用了...

42780
来自专栏Linyb极客之路

并发编程之同步容器类和并发容器类

一、fail-fast机制 快速报错机制(fail-fast)能够防止多个进程同时修改同一个容器的内容。如果在你迭代遍历某个容器的过程中,另一个进程接入其中,...

30590
来自专栏用户2442861的专栏

shell脚本方便操作记录(持续添加)

http://blog.csdn.net/richerg85/article/details/44001501

24410
来自专栏小狼的世界

IE下JS文件失效问题总结

今天遇到了一个很诡异的问题,Firefox下好好的页面,在IE下却接二连三的报错,这到底是什么地方产生的错误。

15330
来自专栏李航的专栏

Shell 主要逻辑源码级分析:SHELL 运行流程 (1)

分享一下在学校的时候分析shell源码的一些收获,帮助大家了解shell的一个工作流程,从软件设计的角度,看看shell这样一个历史悠久的软件的一些设计优点和缺...

2.2K00
来自专栏Danny的专栏

静态代理与动态代理

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

9530
来自专栏服务端技术杂谈

Golang笔记

静态编译 编译时一个将源代码翻译成低级语言的过程。编译过程比较慢,在设计Go时,编译速度是主要的设计目标之一。静态类型意味着变量必须指定一个类型,如整形,字符串...

30740
来自专栏WindCoder

logstash6配置语法中的条件判断

有时您只想在特定条件下过滤或输出事件。为此,您可以使用条件(conditional)。比如在elk系统中想要添加一个type类型的关键字来根据不同的条件赋值,最...

2K10

扫码关注云+社区

领取腾讯云代金券