redis大key问题-scan、hscan、sscan、zscan等命令
文档
- redis单机安装
- redis集群模式 -集群搭建
- redis大key问题-生成大key-生成100万条测试数据
- redis惰性删除与异步删除
- redis禁用keys、flushdb、flushall等命令
官方文档
下载地址
说明
- 版本选择:
redis-7.0.0.tar.gz - 下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz
redis大key问题-scan命令
安装redis
- 以单机版redis为例,安装redis参考文档:redis单机安装
添加测试数据
- 生成string、list、hash、set、zset等类型的测试数据,参考:redis大key问题-生成大key-生成100万条测试数据
scan命令说明
-
命令说明,https://redis.io/docs/latest/commands/SCAN/
语法
shellSCAN 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 命令不需要任何键名参数,因为它迭代当前数据库中的键,所以被迭代的对象是数据库本身。
-
基本用法
SCAN 是基于游标的迭代器。这意味着在每次调用命令时,服务器会返回一个更新的游标,用户需要在下次调用中将其作为游标参数使用。
当游标设置为 0 时,迭代开始;当服务器返回的游标为 0 时,迭代终止。
-
参数含义
-
命令:
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] -
cursor:游标,用于迭代遍历,第一次调用使用0,后续调用使用上一次返回的游标,返回0表示迭代完成 -
[MATCH pattern]:匹配模式,过滤key。例如:scan 0 match "user:*",表示匹配user:开头的key -
[COUNT count]:每次扫描的提示数量,不是精确返回的数量。默认是10。例如:scan 0 count 10 -
[TYPE type]:按类型过滤key。例如:SCAN 0 TYPE string,表示只返回string类型的key -
[NOVALUES]:hscan特有的参数,使用NOVALUES参数只返回哈希表中的键,而不返回对应的值。例如:hscan big:hash:50w 0 COUNT 5 NOVALUES-
HSCAN key cursor [MATCH pattern] [COUNT count] [NOVALUES] -
[NOVALUES]开始于7.4,https://redis.io/docs/latest/commands/hscan/#return-informationArray 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
NOVALUESflag (since Redis 7.4) is used, only the field names are returned.
-
-
scan命令示例
-
扫描
big:开头的key,每次扫描提示数量为500000shell127.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命令示例
-
扫描hash类型的键
big:hash:50w,匹配field_开头的字段及值shell127.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> -
扫描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命令示例
-
扫描set类型的键
big:set:50w,匹配member_开头的成员shell127.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命令示例
-
扫描zset类型的键
big:zset:50w,匹配member_开头的成员shell127.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>
参考资料
注意事项
- 部分内容由AI生成
- 如有不对,欢迎指正!!!