redis大key问题-scan、hscan、sscan、zscan等命令

redis大key问题-scan、hscan、sscan、zscan等命令

文档

  1. redis单机安装
  2. redis集群模式 -集群搭建
  3. redis大key问题-生成大key-生成100万条测试数据
  4. redis惰性删除与异步删除
  5. redis禁用keys、flushdb、flushall等命令

官方文档

  1. 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
  2. Redis cluster specification

下载地址

  1. 官网:https://redis.io/
  2. 下载列表页面:https://download.redis.io/releases/

说明

  1. 版本选择:redis-7.0.0.tar.gz
  2. 下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz

redis大key问题-scan命令

安装redis
  1. 以单机版redis为例,安装redis参考文档:redis单机安装
添加测试数据
  1. 生成string、list、hash、set、zset等类型的测试数据,参考:redis大key问题-生成大key-生成100万条测试数据
scan命令说明
  1. 命令说明,https://redis.io/docs/latest/commands/SCAN/

    语法

    shell 复制代码
    SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

    自版本起可用:

    • Redis 开源版 2.8.0

    时间复杂度:

    • 每次调用为 O(1)。完整迭代为 O(N),包括使游标返回到 0 所需的足够命令调用。N 是集合内的元素数量。

    ACL 分类:

    • @keyspace, @read, @slow

    兼容性:

    • 兼容 Redis Enterprise 和 Redis Cloud

    SCAN 命令以及密切相关的 SSCAN、HSCAN 和 ZSCAN 用于增量迭代元素集合。

    • SCAN 迭代当前所选 Redis 数据库中的键集合。

    • SSCAN 迭代 Set 类型的元素。

    • HSCAN 迭代 Hash 类型的字段及其关联的值。

    • ZSCAN 迭代 Sorted Set 类型的元素及其关联的分数。

    由于这些命令支持增量迭代,每次调用只返回少量元素,因此可以在生产环境中使用,而不会像 KEYS 或 SMEMBERS 那样在针对大的键或元素集合调用时可能长时间阻塞服务器(甚至几秒)。

    但是,虽然像 SMEMBERS 这样的阻塞命令能够提供在给定时刻属于 Set 的所有元素,SCAN 系列命令对返回的元素只提供有限的保证,因为我们增量迭代的集合在迭代过程中可能会发生变化。

    请注意, 的工作方式非常相似,因此本文档涵盖所有四个命令。不过,一个明显的区别是:对于 SSCAN、HSCAN 和 ZSCAN,第一个参数是保存 Set、Hash 或 Sorted Set 值的键的名称。SCAN 命令不需要任何键名参数,因为它迭代当前数据库中的键,所以被迭代的对象是数据库本身。

  2. 基本用法

    SCAN 是基于游标的迭代器。这意味着在每次调用命令时,服务器会返回一个更新的游标,用户需要在下次调用中将其作为游标参数使用。

    当游标设置为 0 时,迭代开始;当服务器返回的游标为 0 时,迭代终止。

  3. 参数含义

    1. 命令:SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

    2. cursor:游标,用于迭代遍历,第一次调用使用0,后续调用使用上一次返回的游标,返回0表示迭代完成

    3. [MATCH pattern]:匹配模式,过滤key。例如:scan 0 match "user:*",表示匹配user:开头的key

    4. [COUNT count]:每次扫描的提示数量,不是精确返回的数量。默认是10。例如:scan 0 count 10

    5. [TYPE type]:按类型过滤key。例如:SCAN 0 TYPE string,表示只返回string类型的key

    6. [NOVALUES]hscan特有的参数,使用NOVALUES参数只返回哈希表中的键,而不返回对应的值。例如:hscan big:hash:50w 0 COUNT 5 NOVALUES

      1. HSCAN key cursor [MATCH pattern] [COUNT count] [NOVALUES]

      2. [NOVALUES]开始于7.4,https://redis.io/docs/latest/commands/hscan/#return-information

        Array reply: a two-element array.

        • The first element is a Bulk string reply that represents an unsigned 64-bit number, the cursor.
        • The second element is an Array reply of field/value pairs that were scanned. When the NOVALUES flag (since Redis 7.4) is used, only the field names are returned.
scan命令示例
  1. 扫描big:开头的key,每次扫描提示数量为500000

    shell 复制代码
    127.0.0.1:6379> scan 0 match "big:*" count 500000
    1) "343038"
    2) 1) "big:hash:10w"
       2) "big:string:10w"
       3) "big:list:50w"
       4) "big:string:5w"
       5) "big:list:5w"
       6) "big:list:10w"
       7) "big:set:5w"
       8) "big:zset:50w"
    127.0.0.1:6379> scan 343038 match "big:*" count 500000
    1) "589823"
    2) 1) "big:string:50w"
       2) "big:hash:5w"
       3) "big:set:50w"
       4) "big:hash:50w"
       5) "big:zset:10w"
       6) "big:zset:5w"
       7) "big:set:10w"
    127.0.0.1:6379> scan 589823 match "big:*" count 500000
    1) "0"
    2) (empty array)
    127.0.0.1:6379>
    • 第二次查询的游标要使用第一次返回的值,也就是343038,当返回的游标为0时,说明迭代完成
    • count仅能表示提示数量,并不是精准数量
hscan命令示例
  1. 扫描hash类型的键big:hash:50w,匹配field_开头的字段及值

    shell 复制代码
    127.0.0.1:6379> hscan big:hash:50w 0 MATCH "field_*"
    1) "98304"
    2)  1) "field_221477"
        2) "value_221477"
        3) "field_210737"
        4) "value_210737"
        5) "field_164146"
        6) "value_164146"
        7) "field_107349"
        8) "value_107349"
        9) "field_414450"
       10) "value_414450"
       11) "field_232027"
       12) "value_232027"
       13) "field_278181"
       14) "value_278181"
       15) "field_200739"
       16) "value_200739"
       17) "field_228896"
       18) "value_228896"
       19) "field_195455"
       20) "value_195455"
    127.0.0.1:6379>
  2. 扫描hash类型的键big:hash:50w,匹配field_开头的字段,不返回值。7.4版本才支持,下面是官网示例

    shell 复制代码
    > HSET myhash a 1 b 2
    OK
    > HSCAN myhash 0
    1) "0"
    2) 1) "a"
       2) "1"
       3) "b"
       4) "2"
    > HSCAN myhash 0 NOVALUES
    1) "0"
    2) 1) "a"
       2) "b"
sscan命令示例
  1. 扫描set类型的键big:set:50w,匹配member_开头的成员

    shell 复制代码
    127.0.0.1:6379> sscan big:set:50w 0 match member_*
    1) "294912"
    2)  1) "member_370684"
        2) "member_442041"
        3) "member_149988"
        4) "member_169570"
        5) "member_397674"
        6) "member_343481"
        7) "member_453169"
        8) "member_141326"
        9) "member_163354"
       10) "member_379978"
       11) "member_362765"
    127.0.0.1:6379>
    • 与scan命令不同的是,需要指定set类型的key
    • 如果不是set类型的key,会提示错误
zscan命令示例
  1. 扫描zset类型的键big:zset:50w,匹配member_开头的成员

    shell 复制代码
    127.0.0.1:6379> zscan big:zset:50w 0 MATCH member_*
    1) "294912"
    2)  1) "member_370684"
        2) "370684"
        3) "member_442041"
        4) "442041"
        5) "member_149988"
        6) "149988"
        7) "member_169570"
        8) "169570"
        9) "member_397674"
       10) "397674"
       11) "member_343481"
       12) "343481"
       13) "member_453169"
       14) "453169"
       15) "member_141326"
       16) "141326"
       17) "member_163354"
       18) "163354"
       19) "member_379978"
       20) "379978"
       21) "member_362765"
       22) "362765"
    127.0.0.1:6379>

参考资料

  1. https://www.bilibili.com/video/BV13R4y1v7sP

注意事项

  1. 部分内容由AI生成
  2. 如有不对,欢迎指正!!!
相关推荐
k***82511 小时前
Redis-配置文件
数据库·redis·oracle
s***38561 小时前
docker中配置redis
redis·docker·容器
爬山算法1 小时前
Redis(155)Redis的数据持久化如何优化?
数据库·redis·bootstrap
小二李1 小时前
第9章 Node框架实战篇 - Redis 缓存
redis·node.js
m***56721 小时前
docker下搭建redis集群
redis·docker·容器
f***68601 小时前
docker compose安装redis
redis·docker·容器
SoleMotive.10 小时前
如果用户反映页面跳转得非常慢,该如何排查
jvm·数据库·redis·算法·缓存
e***193510 小时前
docker compose安装redis
redis·docker·容器
v***160210 小时前
Linux安装Redis以及Redis三种启动方式
linux·redis·bootstrap