Redis命令:scan实现模糊查询

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis命令:scan实现模糊查询

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

      示例:
      scan 0 match DL* count 5 
      sscan myset 0 match f*

      image.gif

      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();
          }

      image.gif

      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

          相关实践学习
          基于Redis实现在线游戏积分排行榜
          本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
          云数据库 Redis 版使用教程
          云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
          目录
          相关文章
          |
          1月前
          |
          NoSQL Java Redis
          redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
          这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
          48 1
          redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
          |
          16天前
          |
          存储 NoSQL Java
          Redis命令:列表模糊删除详解
          通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
          29 0
          |
          1月前
          |
          缓存 NoSQL 测试技术
          Redis如何解决频繁的命令往返造成的性能瓶颈!
          Redis如何解决频繁的命令往返造成的性能瓶颈!
          |
          1月前
          |
          缓存 NoSQL Redis
          Redis命令:列表模糊删除详解
          Redis命令:列表模糊删除详解
          53 3
          |
          1月前
          |
          NoSQL 关系型数据库 MySQL
          Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
          本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
          240 0
          Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
          |
          1月前
          |
          NoSQL Redis 数据安全/隐私保护
          Redis 命令
          10月更文挑战第15天
          27 0
          |
          2月前
          |
          监控 NoSQL Redis
          redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
          redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
          110 3
          |
          2月前
          |
          存储 缓存 NoSQL
          Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
          Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
          71 0
          |
          3月前
          |
          存储 消息中间件 NoSQL
          Redis命令详解以及存储原理
          Redis命令详解以及存储原理
          |
          4月前
          |
          存储 缓存 NoSQL
          Redis 全局通用命令整理
          Redis 全局通用命令整理
          68 10