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. 如有不对,欢迎指正!!!
相关推荐
爬也要爬着前进11 小时前
redis主从搭建
数据库·redis·缓存
用户0953675158313 小时前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌16 小时前
Redis 3.x——集群故障转移
java·数据库·redis·集群
明豆17 小时前
Redis 分布式缓存生产实战
redis·分布式·缓存
海兰18 小时前
【高速缓存】RedisVL 指南:从向量搜索到 AI 应用落地
人工智能·redis
weixin_7275356218 小时前
双Token认证体系深度拆解:Spring Security + JWT + Redis
redis·spring·wpf
William Dawson19 小时前
【华为云 MRS Redis 安全集群 Kerberos 认证接入实战(Spring Boot \+ Jedis)】
redis·安全·华为云
zhouhui00120 小时前
AI帮我写了个Spring Boot校验,线上漏掉了这组边界条件
java·spring boot·redis·ai编程
吃饱了得干活20 小时前
扫码登录如何实现?从原理到实战
java·spring boot·redis
熊猫钓鱼>_>2 天前
Redis 突发缓存穿透:一次完整的定位复盘
数据库·人工智能·redis·缓存·ai·agent·智能