Redis 的 SCAN 命令详解及使用场景

阅读时长 3 分钟读完

Redis是一款高性能内存数据库,常用于对部分数据进行缓存、快速读写等任务。 SCAN命令是Redis中一个常用的迭代命令,可以逐步遍历数据库中的所有 keys,同时也可以支持模式匹配。

SCAN 命令的基本语法

  • cursor: 返回的游标ID,非0数字。
  • MATCH pattern: 匹配模式,类似于keys命令中的模式。
  • COUNT count: 指定返回的key数量,默认为10个。

该命令会返回两个值:第一个返回值是下一次迭代的起始游标,第二个返回值是当次迭代获得的 keys。

SCAN 命令与 KEYS 命令的对比

Redis中KEYS命令和SCAN命令都可以用于遍历数据库中的 keys,并返回匹配的 key 列表。但它们在多数任务上具有不同的优缺点。

KEYS命令

  • 输入模式匹配模式时可直接返回所有键值列表,无须迭代。
  • 对Redis机器或网络负载造成的压力较大,尤其是当Redis实例中的keys数量达到一定程度时。

SCAN命令

  • 将遍历分布式地关闭到多段独立,可以避免主数据库因一次 keys 迭代命令而导致的阻塞。
  • 通过 COUNT 参数来限制每次扫描的数量,并在迭代过程中释放给定的 CPU 时间片,因此减少了对 Redis机器和网络的负载压力。
  • 支持正则匹配(MATCH 参数)。

SCAN 命令的使用场景

SCAN命令可应用于各种场景,如处理大型数据集、搜索和迭代复杂结构等任务。下面是两个常见的使用场景:

分页查询

将一些数据列表存储到 Redis,但由于数据量较大,不能直接获取完整的列表,因此需要进行分页处理。下面是一个简单的示例代码:

-- -------------------- ---- -------
--- ---- - --
--- ------ - --
--- -------- - ---
--- ----- - --------- -- -- ---- --- ---

-- -
    --- ------ - ----- ------------------------ -------- ------ -------- ----------

    ------ - ----------
    --- ---- - ----------

    --- ---- --- -- ----- -
        --- ---- - ----- ---------------------
        ----------------- -------- ----------
    -

    -------
- ----- ------- --- -----

前缀匹配

想要在 Redis 中匹配一个固定前缀的 key,通常会使用 KEYS 命令,但是,如果键值对数量很多,这会带来很大的开销。SCAN 命令则可以分批次分布式地处理这些键值,使用效果会更好。示例代码:

-- -------------------- ---- -------
--- ------ - --
--- ----- - ---------

-- -
    --- ------ - ----- ------------------------ -------- -------

    ------ - ----------
    --- ---- - ----------

    --- ---- --- -- ----- -
        --- ---- - ----- ---------------------
        ------------------
    -
- ----- ------- --- -----

总结

SCAN命令是 Redis 中迭代和搜索 key 的一种高效方式,虽然其语法相对较复杂,但实际应用起来是非常灵活和简单的。在遇到需要遍历 Redis 键值的情况下,建议考虑使用 SCAN 命令,以减少 Redis 实例的负载,并提高查询性能。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651a938695b1f8cacd276b04

纠错
反馈