Sets 命令 Set 是无序不重复的集合, 集合成员是唯一的, 集合对象的编码可以是 intset 或者 hashtable, 集合是通过哈希表实现的, 最大的成员数为 2^32-1(40 多亿)个成员.
Set: 键名: key, 键类型: set, 键值: string
Set 类型的底层数据结构是由哈希表 或整数集合 实现的
如果集合中的元素都是整数且元素个数小于 512 个, Redis 使用整数集合 作为底层数据结构
如果集合中的元素不满足上面条件, Redis 使用哈希表 作为底层数据结构
1 2 set-max-intset-entries 512
成员操作
SADD key member [member …] 向集合中添加多个成员并返回添加成功的数量, 0 表示有重复成员
SCARD key 获取集合成员的数量, 集合为空或者不存在返回 0
SMEMBERS key 获取集合中所有的成员, 集合为空或者不存在返回 (empty array)
是否包含成员
SISMEMBER key member 判断 member 是不是集合的成员, 1 是, 0 不是或者集合为空或者不存在
SMISMEMBER key member [member …] 批量判断多个 member 是不是集合的成员, 1 是, 0 不是或者集合为空或者不存在, Redis 6.2.0 支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> KEYS * (empty array) 127.0.0.1:6379> SMISMEMBER myset hello hehe 1) (integer ) 0 2) (integer ) 0 127.0.0.1:6379> SADD myset hello world hehe haha gg (integer ) 127.0.0.1:6379> SMISMEMBER myset hello yy hehe 1) (integer ) 1 2) (integer ) 0 3) (integer ) 1
批量移除成员
SREM key member [member …] 批量移除集合中的成员并返回移除成功的数量, 集合为空或者不存在或者不包含移除成员返回 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 127.0.0.1:6379> KEYS * (empty array) 127.0.0.1:6379> SADD set hello world gg (integer ) 3 127.0.0.1:6379> SMEMBERS set 1) "gg" 2) "world" 3) "hello" 127.0.0.1:6379> SREM myset a b (integer ) 0 127.0.0.1:6379> SREM set a b (integer ) 0 127.0.0.1:6379> SREM set hello a (integer ) 1 127.0.0.1:6379> SMEMBERS set 1) "gg" 2) "world" 127.0.0.1:6379> SREM set world gg (integer ) 2 127.0.0.1:6379> SMEMBERS key (empty array)
移除指定成员并添加到其他集合
SMOVE source destination member 将源集合中的指定成员移除并添加到目标集合中
返回值
1 表示源集合指定成员移除成功(目标集合中可能包含该成员也可能不包含)
0 表示源集合为空或者源集合不包含指定成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379> SMOVE myset destset hello (integer ) 0 127.0.0.1:6379> SADD myset hello world (integer ) 2 127.0.0.1:6379> SMOVE myset destset hello (integer ) 1 127.0.0.1:6379> SMEMBERS myset 1) "world" 127.0.0.1:6379> SMEMBERS destset 1) "hello" 127.0.0.1:6379> SMOVE myset destset hehe (integer ) 0 127.0.0.1:6379> SMEMBERS myset 1) "world" 127.0.0.1:6379> SMEMBERS destset 1) "hello" 127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379> SADD myset hello world (integer ) 2 127.0.0.1:6379> SADD destset hello gg (integer ) 2 127.0.0.1:6379> SMOVE myset destset hello (integer ) 1 127.0.0.1:6379> SMEMBERS myset 1) "world" 127.0.0.1:6379> SMEMBERS destset 1) "gg" 2) "hello"
随机获取成员
SPOP key [count] 移除指定集合随机的多个成员并返回移除的成员, 改变原集合, 不带 count 如果集合为空或者不存在返回 <nil>, 否则返回 (empty array), count 不能为负数
count 指定随机移除的数量, 默认为 1
count >= 1 时, 空集合返回 (empty array)
count = 0 时, 任何集合都返回 (empty array)
count < 0 时, 返回错误, count must be positive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379> SPOP myset (nil) 127.0.0.1:6379> SPOP myset 2 (empty array) 127.0.0.1:6379> SADD myset hello world hehe haha gg yy (integer ) 6 127.0.0.1:6379> SPOP myset 0 (empty array) 127.0.0.1:6379> SPOP newset 0 (empty array) 127.0.0.1:6379> SPOP myset -1 (error) ERR value is out of range, must be positive 127.0.0.1:6379> SPOP myset "world" 127.0.0.1:6379> SPOP myset 3 1) "haha" 2) "yy" 3) "gg" 127.0.0.1:6379> SMEMBERS myset 1) "hehe" 2) "hello"
SRANDMEMBER key [count] 返回指定集合随机的多个成员, 不改变原集合, 不带 count 如果集合为空或者不存在返回 <nil>, 否则返回 (empty array), count 为负数将会取绝对值
count 指定随机返回的数量, 默认为 1
count >= 1 时, 空集合返回 (empty array)
count = 0 时, 任意集合都返回 (empty array)
count < 0 时, 空集合返回 (empty array), 非空集合返回 count 的绝对值数量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 127.0.0.1:6379> KEYS * 1) "myset" 127.0.0.1:6379> SMEMBERS myset 1) "haha" 2) "yy" 3) "world" 4) "hehe" 5) "hello" 6) "gg" 127.0.0.1:6379> SRANDMEMBER newset (nil) 127.0.0.1:6379> SRANDMEMBER newset 0 (empty array) 127.0.0.1:6379> SRANDMEMBER newset 1 (empty array) 127.0.0.1:6379> SRANDMEMBER newset -1 (empty array) 127.0.0.1:6379> SRANDMEMBER myset "hello" 127.0.0.1:6379> SRANDMEMBER myset 0 (empty array) 127.0.0.1:6379> SRANDMEMBER myset 2 1) "gg" 2) "yy" 127.0.0.1:6379> SRANDMEMBER myset -2 1) "haha" 2) "hello" 127.0.0.1:6379> SCARD myset (integer ) 6
遍历无序集合
SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的成员, 返回下一次游标开始的位置和结果, 游标 0 表示迭代已结束
cursor 游标
pattern 匹配的模式
count 控制从数据集返回的成员数量, 默认为 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379> SSCAN myset 0 MATCH a COUNT 10 1) "0" 2) (empty array) 127.0.0.1:6379> SADD myset a b c d aa ab ac ad ba bb bc bd ca cb cc cd da db dc dd (integer ) 20 127.0.0.1:6379> SSCAN myset 0 MATCH a* COUNT 20 1) "0" 2) 1) "ad" 2) "a" 3) "ac" 4) "aa" 5) "ab" 127.0.0.1:6379> SSCAN myset 0 MATCH *c COUNT 8 1) "10" 2) 1) "dc" 2) "cc" 3) "ac" 4) "c" 127.0.0.1:6379> SSCAN myset 10 MATCH *c COUNT 8 1) "11" 2) 1) "bc"
获取无序集合差异
SDIFF key [key …] 比较第一个集合和其他集合之间的差异并返回差异的结果, 第一个集合为空或者第一个集合的所有成员在出现在其他集合中返回(empty array)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 127.0.0.1:6379> KEYS * 1) "myset" 127.0.0.1:6379> SMEMBERS myset 1) "world" 2) "hello" 127.0.0.1:6379> SDIFF myset newset newset2 1) "world" 2) "hello" 127.0.0.1:6379> SADD newset hello gg (integer ) 2 127.0.0.1:6379> SDIFF myset newset newset2 1) "world" 127.0.0.1:6379> SADD newset2 hehe (integer ) 1 127.0.0.1:6379> SDIFF myset newset newset2 1) "world" 127.0.0.1:6379> SADD newset2 world (integer ) 1 127.0.0.1:6379> SDIFF myset newset newset2 (empty array) 127.0.0.1:6379> DEL myset (integer ) 1 127.0.0.1:6379> KEYS * 1) "newset2" 2) "newset" 127.0.0.1:6379> SDIFF myset newset newset2 (empty array)
SDIFFSTORE destination key [key …] 比较第一个集合和其他集合之间的差异把差异结果存储到指定集合并返回指定集合的数量, 如果指定集合不存在则新建, 如果指定集合存在则覆盖指定集合, 0 表示未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 127.0.0.1:6379> KEYS * (empty array) 127.0.0.1:6379> SADD myset hello world (integer ) 2 127.0.0.1:6379> SADD newset world gg (integer ) 2 127.0.0.1:6379> SADD destset hehe haha (integer ) 2 127.0.0.1:6379> KEYS * 1) "destset" 2) "myset" 3) "newset" 127.0.0.1:6379> SDIFFSTORE destset myset newset (integer ) 1 127.0.0.1:6379> SMEMBERS destset 1) "hello"
获取无序集合交集
SINTER key [key …] 返回所有给定集合之间的交集, key 不存在被当作空集合, 当给定集合中有一个空集合时返回结果也为空集合(empty array)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 127.0.0.1:6379> KEYS * (empty array) 127.0.0.1:6379> SADD myset hello world (integer ) 2 127.0.0.1:6379> SINTER myset newset (empty array) 127.0.0.1:6379> SADD newset hehe hello (integer ) 2 127.0.0.1:6379> SINTER myset newset 1) "hello" 127.0.0.1:6379> SADD newset2 world gg (integer ) 2 127.0.0.1:6379> SINTER myset newset newset2 (empty array)
SINTERSTORE destination key [key …] 将所有给定集合之间的交集存储到指定的集合中并返回指定集合的数量, 如果指定集合不存在则新建, 如果指定集合已存在则覆盖指定集合, 0 表示未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0.0.1:6379> KEYS * (empty array) 127.0.0.1:6379> SADD myset hello world (integer ) 2 127.0.0.1:6379> SADD newset hello hehe (integer ) 2 127.0.0.1:6379> SADD destset gg yy (integer ) 2 127.0.0.1:6379> SINTERSTORE destset myset newset (integer ) 1 127.0.0.1:6379> SMEMBERS destset 1) "hello"
SINTERCARD numkeys key [key …] [LIMIT limit] 返回给定多个集合的交集的数量, 0 表示未找到结果, Redis 7.0.0 支持
numkeys 指定集合的数量, 值和 key 的数量不一致时返回语法错误 syntax error
limit 指定返回结果的偏移量, 默认为 0, limit < 0 时, 报错不能为负数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 127.0.0.1:6379> KEYS * (empty array) 127.0.0.1:6379> SINTERCARD 1 myset newset (error) ERR syntax error 127.0.0.1:6379> SINTERCARD 2 myset newset (integer ) 0 127.0.0.1:6379> SADD myset hello world hehe haha gg yy (integer ) 6 127.0.0.1:6379> SADD newset hello hehe haha yy (integer ) 4 127.0.0.1:6379> SINTERCARD 2 myset newset (integer ) 4 127.0.0.1:6379> SINTERCARD 2 myset newset LIMIT 0 (integer ) 4 127.0.0.1:6379> SINTERCARD 2 myset newset LIMIT 1 (integer ) 1 127.0.0.1:6379> SINTERCARD 2 myset newset LIMIT 3 (integer ) 3 127.0.0.1:6379> SINTERCARD 2 myset newset LIMIT -1 (error) ERR LIMIT can't be negative
获取无序集合并集
SUNION key [key …] 返回所有给定集合的并集并移除相同的成员只保留一个, 不存在的 key 被当作空集合, 集合都为空返回 (empty array)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379> SUNION myset newset (empty array) 127.0.0.1:6379> SADD myset hello world (integer ) 2 127.0.0.1:6379> SUNION myset newset 1) "world" 2) "hello" 127.0.0.1:6379> SADD newset hello hehe (integer ) 2 127.0.0.1:6379> SUNION myset newset 1) "world" 2) "hehe" 3) "hello"
SUNIONSTORE destination key [key …] 将所有给定集合之间的并集存储到指定的集合中并返回指定集合的数量, 如果指定集合不存在则新建, 如果指定集合已存在则覆盖指定集合, 0 表示未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379> SUNIONSTORE destset myset newset (integer ) 0 127.0.0.1:6379> SADD myset hello world (integer ) 2 127.0.0.1:6379> SUNIONSTORE destset myset newset (integer ) 2 127.0.0.1:6379> SMEMBERS destset 1) "world" 2) "hello" 127.0.0.1:6379> SADD newset hello hehe haha (integer ) 3 127.0.0.1:6379> SUNIONSTORE destset myset newset (integer ) 4 127.0.0.1:6379> SMEMBERS destset 1) "world" 2) "hehe" 3) "haha" 4) "hello"
应用
Sorted sets 命令
Redis 7.0 开始, 压缩列表数据结构由 listpack 数据结构实现
大部分 Set 的 API 将首字母 s 换成 z 就可以使用, 这里只列出部分不一致的 API
Sorted sets 和 set 一样也是 string 类型元素的集合, 且不允许重复的成员, 不同的是每个元素都会关联一个 double 类型的分值, Redis 正是通过分值来为集合中的成员进行从小到大的排序, 有序集合的成员是唯一的,但分值(score)却可以重复, 集合是通过哈希表实现的, 最大的成员数为 2^32-1(40 多亿)个成员.
Zset: 键名: key, 键类型: zset, 键值: string {value => score}
Zset 类型的底层数据结构是由压缩列表 或跳表 实现的
如果有序集合的元素个数小于 128 个并且每个元素的值小于 64B 时, Redis 使用压缩列表 作为底层数据结构
如果有序集合的元素不满足上面条件, Redis 使用跳表 作为底层数据结构
1 2 3 zset-max-listpack-entries 128 zset-max-listpack-value 64
特殊标识符
- 负
+ 正
inf 无穷大
(val 不包含 val
[val 包含 val
添加成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 127.0.0.1:6379> ZADD myz 1 zhangsan 2 lisi (integer ) 2 127.0.0.1:6379> ZCARD myz (integer ) 2 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "lisi" 2) "2" 3) "zhangsan" 4) "1" 127.0.0.1:6379> ZADD myz XX 1.5 zhangsan 1 wangwu 3.5 zhaoliu (integer ) 0 127.0.0.1:6379> ZCARD myz (integer ) 2 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "lisi" 2) "2" 3) "zhangsan" 4) "1.5" 127.0.0.1:6379> ZADD myz NX 2.5 lisi 1 wangwu 3.5 zhaoliu (integer ) 2 127.0.0.1:6379> ZCARD myz (integer ) 4 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "zhaoliu" 2) "3.5" 3) "lisi" 4) "2" 5) "zhangsan" 6) "1.5" 7) "wangwu" 8) "1" 127.0.0.1:6379> ZADD myz LT 0.5 lisi 4 sunqi (integer ) 1 127.0.0.1:6379> ZCARD myz (integer ) 5 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "sunqi" 2) "4" 3) "zhaoliu" 4) "3.5" 5) "zhangsan" 6) "1.5" 7) "wangwu" 8) "1" 9) "lisi" 10) "0.5" 127.0.0.1:6379> ZADD myz LT 1 lisi 8 sunqi (integer ) 0 127.0.0.1:6379> ZCARD myz (integer ) 5 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "sunqi" 2) "4" 3) "zhaoliu" 4) "3.5" 5) "zhangsan" 6) "1.5" 7) "wangwu" 8) "1" 9) "lisi" 10) "0.5" 127.0.0.1:6379> ZADD myz GT 1 zhangsan 2 qianba (integer ) 1 127.0.0.1:6379> ZCARD myz (integer ) 6 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "sunqi" 2) "4" 3) "zhaoliu" 4) "3.5" 5) "qianba" 6) "2" 7) "zhangsan" 8) "1.5" 9) "wangwu" 10) "1" 11) "lisi" 12) "0.5" 127.0.0.1:6379> ZADD myz GT 3 zhangsan 2 qianba (integer ) 0 127.0.0.1:6379> ZCARD myz (integer ) 6 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "sunqi" 2) "4" 3) "zhaoliu" 4) "3.5" 5) "zhangsan" 6) "3" 7) "qianba" 8) "2" 9) "wangwu" 10) "1" 11) "lisi" 12) "0.5" 127.0.0.1:6379> ZADD myz CH 1 zhangsan 5 qianba 1 hello (integer ) 3 127.0.0.1:6379> ZADD myz INCR 10 zhangsan "10" 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "zhangsan" 2) "10"
指定成员的分值增量
ZINCRBY key increment member 对指定成员的分值加上增量并返回修改后的分值, 如果指定成员不存在则添加新成员, 等同于 ZADD key increment member
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 127.0.0.1:6379> ZINCRBY myz 2 zhangsan "3.5" 127.0.0.1:6379> ZINCRBY myz 2 zhangsan1 "2" 127.0.0.1:6379> ZINCRBY myz -2 zhaoliu "1.5" 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "zhangsan" 2) "3.5" 3) "lisi" 4) "2.5" 5) "zhangsan1" 6) "2" 7) "zhaoliu" 8) "1.5" 9) "wangwu" 10) "1"
移除成员 分值最大或最小
ZPOPMAX key [count] 移除指定集合的指定数量的最高分值成员并返回移除的成员和分值, count 默认为 1, 如果集合为空或者不存在返回 (empty array), Redis `5.0.0 支持
count < 0 时, 报错 ERR value is out of range, must be positive
count = 0 时, 不做任何操作, 返回 empty array
count > 1 时, 指定移除数量
BZPOPMAX key [key …] timeout 阻塞版 ZPOPMAX
, 从多个集合中第 1 个非空集合中移除并返回 1 个最高分值成员, 如果集合为空会阻塞集合直到等待超时或发现可移除成员为止, 如果集合为空或者超时返回 <nil>, 否则, 返回 1 个含有 3 个元素的列表, 第 1 个为被移除成员所属的集合, 第 2 个为被移除的成员, 第 3 个为移除成员的分值, Redis 5.0.0 支持
ZPOPMIN key [count] 移除指定集合的指定数量的最低分值成员并返回移除的成员和分值, count 默认为 1, 如果集合为空或者不存在返回 (empty array), Redis 5.0.0 支持
BZPOPMIN key [key …] timeout 阻塞版 ZPOPMIN
, 从多个集合中第 1 个非空集合中移除并返回 1 个最低分值成员, 如果集合为空会阻塞集合直到等待超时或发现可移除成员为止, 如果集合为空或者超时返回 <nil>, 否则, 返回 1 个含有 3 个元素的列表, 第 1 个为被移除成员所属的集合, 第 2 个为被移除的成员, 第 3 个为移除成员的分值, Redis 5.0.0 支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 127.0.0.1:6379> ZPOPMAX myz -1 (error) ERR value is out of range, must be positive 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 3 d 2 e 1 f (integer ) 6 127.0.0.1:6379> ZPOPMAX myzz (empty array) 127.0.0.1:6379> ZPOPMAX myz 0 (empty array) 127.0.0.1:6379> ZPOPMAX myz 1) "d" 2) "3" 127.0.0.1:6379> ZPOPMAX myz 3 1) "d" 2) "3" 3) "c" 4) "3" 5) "e" 6) "2" 127.0.0.1:6379> ZPOPMIN myz 0 (empty array) 127.0.0.1:6379> ZPOPMIN myz 1) "a" 2) "1" 127.0.0.1:6379> ZPOPMIN myz 3 1) "a" 2) "1" 3) "f" 4) "1" 5) "b" 6) "2" 127.0.0.1:6379> BZPOPMAX myz1 myz 0 1) "myz" 2) "d" 3) "4" 127.0.0.1:6379> BZPOPMIN myz1 myz 0 1) "myz" 2) "a" 3) "1"
指定区间
ZREMRANGEBYLEX key min max 移除指定字典区间的所有成员并返回成功移除的数量, min 和 max 需要使用 (
或 [
前导符, 0 表示集合为空或者未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 127.0.0.1:6379> ZREMRANGEBYLEX myz a f (error) ERR min or max not valid string range item 127.0.0.1:6379> ZADD myz 0 a 0 b 0 c 0 d 0 e 0 alpha 0 zip (integer ) 7 127.0.0.1:6379> ZREMRANGEBYLEX myz (alpha [zip (integer ) 5 127.0.0.1:6379> ZRANGE myz 0 -1 1) "a" 2) "alpha" 127.0.0.1:6379> ZREMRANGEBYLEX myz [alpha (zip (integer ) 5 127.0.0.1:6379> ZRANGE myz 0 -1 1) "a" 2) "zip"
ZREMRANGEBYSCORE key min max 移除指定分值区间的所有成员并返回成功移除的数量, 0 表示集合为空或者未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 127.0.0.1:6379> ZREMRANGEBYSCORE myz1 100 500 (integer ) 0 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 4 d 5 e 6 f 2 beta 3 cipher 4 delete (integer ) 9 127.0.0.1:6379> ZREMRANGEBYSCORE myz 2 5 (integer ) 7 127.0.0.1:6379> ZRANGE myz 0 -1 1) "a" 2) "f" 127.0.0.1:6379> ZREMRANGEBYSCORE myz (2 (5 (integer ) 4 127.0.0.1:6379> zrange myz 0 -1 1) "a" 2) "b" 3) "beta" 4) "e" 5) "f"
ZREMRANGEBYRANK key start stop 移除指定排名区间的所有成员并返回成功移除的数量, 0 表示集合为空或者未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 127.0.0.1:6379> ZREMRANGEBYRANK myz1 1 4 (integer ) 0 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 4 d 5 e 6 f 2 beta 3 cipher 4 delete (integer ) 9 127.0.0.1:6379> ZREMRANGEBYRANK myz 1 4 (integer ) 4 127.0.0.1:6379> ZRANGE myz 0 -1 1) "a" 2) "d" 3) "delete" 4) "e" 5) "f" 127.0.0.1:6379> ZREMRANGEBYRANK myz 1 5 (integer ) 5 127.0.0.1:6379> ZRANGE myz 0 -1 1) "a" 2) "delete" 3) "e" 4) "f"
批量移除相同成员
ZREM key member [member …] 批量移除指定的成员并返回成功移除的数量, 如果指定成员不存在则被忽略, 0 表示集合为空或者成员不存在
1 2 3 4 5 6 127.0.0.1:6379> ZADD myz 1 hello 2 world 3 gg 2 yy 1 hehe 4 haha (integer ) 6 127.0.0.1:6379> ZREM myz YY GG (integer ) 0 127.0.0.1:6379> ZREM myz gg GG (integer ) 1
批量移除相邻成员
ZMPOP numkeys key [key …] MIN|MAX [COUNT count] 从多个集合中第 1 个非空集合中移除指定数量的最高或最低分值的成员并返回移除的成员和分值及成员所属的集合名称, count 默认为 1, 集合为空或者不存在返回 <nil>, Redis 7.0.0 支持
COUNT count 移除成员的数量, 默认为 1
BZMPOP timeout numkeys key [key …] MIN|MAX [COUNT count] 阻塞版 ZMPOP
, 如果集合为空会阻塞集合直到等待超时或发现可移除成员为止, 如果集合为空或者超时返回 <nil>, Redis 7.0.0 支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 127.0.0.1:6379> BZMPOP 5 2 myzz myz MAX COUNt 2 (nil) (5.09s) 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 3 d 3 e 2 f 2 g 1 h 4 i (integer ) 9 127.0.0.1:6379> ZMPOP 2 myzz myz MAX 1) "myz" 2) 1) 1) "i" 2) "4" 127.0.0.1:6379> ZMPOP 2 myzz myz MAX COUNT 2 1) "myz" 2) 1) 1) "i" 2) "4" 2) 1) "e" 2) "3" 127.0.0.1:6379> ZMPOP 2 myzz myz MIN COUNT 3 1) "myz" 2) 1) 1) "a" 2) "1" 2) 1) "h" 2) "1" 3) 1) "b" 2) "2" 127.0.0.1:6379> BZMPOP 5 2 myzz myz MAX COUNt 4 1) "myz" 2) 1) 1) "i" 2) "4" 2) 1) "e" 2) "3" 3) 1) "d" 2) "3" 4) 1) "c" 2) "3"
获取成员数量
ZCARD key 返回指定集合的成员数量, 集合为空或者不存在返回 0
指定分值区间
ZCOUNT key min max 统计指定分值区间的成员数量, 0 表示未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "zhaoliu" 2) "3.5" 3) "lisi" 4) "2.5" 5) "zhangsan" 6) "1.5" 7) "wangwu" 8) "1" 127.0.0.1:6379> ZCOUNT myz -inf +inf (integer ) 4 127.0.0.1:6379> ZCOUNT myz 0 2 (integer ) 2 127.0.0.1:6379> ZCOUNT myz 1.5 3 (integer ) 2
指定字典区间
ZLEXCOUNT key min max 计算指定字典区间内成员数量, 0 表示未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 4 d 5 e 6 f (integer ) 6 127.0.0.1:6379> ZLEXCOUNT myz - + (integer ) 6 127.0.0.1:6379> ZLEXCOUNT myz (b [f (integer ) 4 127.0.0.1:6379> ZLEXCOUNT myz [b [f (integer ) 5 127.0.0.1:6379> ZLEXCOUNT myz [d [f (integer ) 3 127.0.0.1:6379> ZLEXCOUNT myz [a [c (integer ) 3 127.0.0.1:6379> ZLEXCOUNT myz [a [b (integer ) 0
随机获取指定数量成员
ZRANDMEMBER key [count [WITHSCORES]] 返回指定集合随机的多个成员, 不改变原集合, 如果集合为空或者不存在返回 <nil>, 否则返回 (empty array), Redis 6.2.0 支持
count 指定随机返回的数量, 默认为 1
count >= 1 时, 空集合返回 (empty array)
count = 0 时, 任意集合都返回 (empty array)
count < 0 时, 空集合返回 (empty array), 非空集合返回 count 的绝对值数量
WITHSCORES 返回结果的分值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 127.0.0.1:6379> ZRANDMEMBER myz1 (nil) 127.0.0.1:6379> ZRANDMEMBER myz1 -1 (empty array) 127.0.0.1:6379> ZADD myz 1 hello 2 world 3 gg 2 yy 4 hehe 5 haha (integer ) 6 127.0.0.1:6379> ZRANDMEMBER myz "world" 127.0.0.1:6379> ZRANDMEMBER myz 0 (empty array) 127.0.0.1:6379> ZRANDMEMBER myz 3 WITHSCORES 1) "hehe" 2) "4" 3) "gg" 4) "3" 5) "yy" 6) "2"
获取指定成员排名 1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "hello" 2) "1" 3) "world" 4) "2" 5) "yy" 6) "2" 7) "gg" 8) "3" 9) "hehe" 10) "4" 11) "haha" 12) "5"
ZRANK key member 返回指定成员的按递增顺序的排名, 从 0 开始计算, 如果指定成员不属于指定集合则返回 <nil>
1 2 3 4 5 6 127.0.0.1:6379> ZRANK myz yy (integer ) 2 127.0.0.1:6379> ZRANK myz world (integer ) 1 127.0.0.1:6379> ZRANK myz HAHA (nil)
ZREVRANK key member 返回指定成员的按递减顺序的排名, 从 0 开始计算, 如果指定成员不属于指定集合则返回 <nil>
1 2 3 4 5 6 127.0.0.1:6379> ZREVRANK myz yy (integer ) 3 127.0.0.1:6379> ZREVRANK myz HAHA (nil) 127.0.0.1:6379> ZREVRANK myz hehe (integer ) 1
获取指定成员分值 1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> ZRANGE myz 0 -1 WITHSCORES 1) "hello" 2) "1" 3) "world" 4) "2" 5) "yy" 6) "2" 7) "gg" 8) "3" 9) "hehe" 10) "4" 11) "haha" 12) "5"
ZSCORE key member 获取指定成员的分值, 如果集合为空或者指定成员不属于集合返回 <nil>
1 2 3 4 5 6 127.0.0.1:6379> ZSCORE myz1 hehe (nil) 127.0.0.1:6379> ZSCORE myz HAHA (nil) 127.0.0.1:6379> ZSCORE myz gg "3"
ZMSCORE key member [member …] 批量获取指定成员的分值, 如果集合为空或者指定成员不属于集合返回 <nil>, Redis 6.2.0 支持
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> ZMSCORE myz HAHA hehe 1) (nil) 2) "4" 127.0.0.1:6379> ZMSCORE myz1 hehe haha 1) (nil) 2) (nil) 127.0.0.1:6379> ZMSCORE myz hello gg 1) "1" 2) "3"
遍历有序集合
ZRANGEBYSCORE 6.2.0 开始废弃, 使用 ZRANGE BYSCORE
代替 ZRANGEBYLEX 6.2.0 开始废弃, 使用 ZRANGE BYLEX
代替
ZREVRANGE 6.2.0 开始废弃, 使用 ZRANGE REV
代替 ZREVRANGEBYSCORE 6.2.0 开始废弃, 使用 ZRANGE BYSCORE REV
代替 ZREVRANGEBYLEX 6.2.0 开始废弃, 使用 ZRANGE BYLEX REV
代替
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 127.0.0.1:6379> ZADD myz 10 a 9 b 13 c 7 d 11 e 6 f (integer ) 6 127.0.0.1:6379> ZRANGE myz (8 (13 BYSCORE WITHSCORES 1) "b" 2) "9" 3) "a" 4) "10" 5) "e" 6) "11" 127.0.0.1:6379> ZRANGE myz 0 -1 REV WITHSCORES 1) "c" 2) "13" 3) "e" 4) "11" 5) "a" 6) "10" 7) "b" 8) "9" 9) "d" 10) "7" 11) "f" 12) "6" 127.0.0.1:6379> ZRANGE myz 0 +inf BYSCORE LIMIT 1 3 WITHSCORES 1) "d" 2) "7" 3) "b" 4) "9" 5) "a" 6) "10"
ZRANGESTORE dst src min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] 命令行为和 ZRANGE
相似, 区别是把结果集存储到指定的集合 dst
中
dst 存储结果集的指定集合
src 被操作的集合
ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的成员(包括成员和分值), 返回下一次游标开始的位置和结果, 游标 0 表示迭代已结束
cursor 游标
pattern 匹配的模式
count 控制从数据集返回的成员数量, 默认为 10
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> ZSCAN myz1 0 1) "0" 2) (empty array) 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 4 d 5 e 6 f (integer ) 6 127.0.0.1:6379> ZSCAN myz 0 MATCH *e* 1) "0" 2) 1) "e" 2) "5"
获取有序集合差异 1 2 3 4 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 4 d (integer ) 4 127.0.0.1:6379> ZADD myzz 5 e 6 b 7 c 8 f (integer ) 4
ZDIFF numkeys key [key …] [WITHSCORES] 比较第一个集合和其他集合之间的差异并返回差异的结果, 第一个集合为空或者第一个集合的所有成员在出现在其他集合中返回(empty array), Redis 6.2.0 支持
ZDIFFSTORE destination numkeys key [key …] 比较第一个集合和其他集合之间的差异把差异结果存储到指定的集合中并返回指定集合的数量, 如果指定集合不存在则新建, 如果指定集合存在则覆盖指定集合, 0 表示未找到结果, Redis 6.2.0 支持
numkeys 指定集合的数量, 值和 key 的数量不一致时返回语法错误 syntax error
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> ZDIFF 2 myz myzz WITHSCORES 1) "a" 2) "1" 3) "d" 4) "4" 127.0.0.1:6379> ZDIFFSTORE destst 2 myz myzz (integer ) 2 127.0.0.1:6379> ZRANGE destst 0 -1 WITHSCORES 1) "a" 2) "1" 3) "d" 4) "4"
获取有序集合交集 1 2 3 4 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c (integer ) 3 127.0.0.1:6379> ZADD myzz 4 b 5 c 6 d (integer ) 3
ZINTER numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES] 返回多个有序集合的交集, key 不存在被当作空集合, 当给定集合中有一个空集合时返回结果也为空集合(empty array), Redis 6.2.0 支持
1 2 3 4 5 6 7 8 9 10 11 12 127.0.0.1:6379> ZINTER 2 myz myzz WEIGHTS 2 3 WITHSCORES 1) "b" 2) "16" 3) "c" 4) "21" 127.0.0.1:6379> ZINTER 2 myz myzz WEIGHTS 2 3 AGGREGATE MAX WITHSCORES 1) "b" 2) "12" 3) "c" 4) "15"
ZINTERCARD numkeys key [key …] [LIMIT limit] 返回多个有序集合的交集的数量, 0 表示未找到结果, Redis 7.0.0 支持
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 计算多个有序集合的交集将结果存储到指定集合并返回保存到指定集合的成员数量, 0 表示未找到结果
destination 指定存储结果集的集合名字
numkeys 指定集合的数量, 值和 key 的数量不一致时返回语法错误 syntax error
WEIGHTS 指定每个排序集合的权重, 每个集合中的成员的分值都会乘以这个权重, 默认为 1, 如果指定此项, 则值的数量必须和 numkeys 一致, 否则报语法错误
AGGREATE 指定结果集聚合的条件, 默认 SUM
SUM 结果集中保留相同成员和所有相同成员分值的求和
MIN 结果集中保留最小分值
MAX 结果集中保留最大分值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 127.0.0.1:6379> ZINTERSTORE destst 2 myz myzz WEIGHTS 1 (error) ERR syntax error 127.0.0.1:6379> ZINTERSTORE destst 2 myz myzz WEIGHTS 1 1 (integer ) 2 127.0.0.1:6379> ZRANGE destst 0 -1 WITHSCORES 1) "c" 2) "8" 3) "b" 4) "6" 127.0.0.1:6379> ZINTERSTORE destst 2 myz myzz WEIGHTS 1 2 (integer ) 2 127.0.0.1:6379> ZRANGE destst 0 -1 WITHSCORES 1) "c" 2) "13" 3) "b" 4) "10" 127.0.0.1:6379> ZINTERSTORE destst 2 myz myzz WEIGHTS 3 2 (integer ) 2 127.0.0.1:6379> ZRANGE destst 0 -1 WITHSCORES 1) "c" 2) "19" 3) "b" 4) "14" 127.0.0.1:6379> ZINTERSTORE destst 2 myz myzz WEIGHTS 3 2 AGGREGATE MIN (integer ) 2 127.0.0.1:6379> ZRANGE destst 0 -1 WITHSCORES 1) "c" 2) "9" 3) "b" 4) "6" 127.0.0.1:6379> ZINTERSTORE destst 2 myz myzz WEIGHTS 3 2 AGGREGATE MAX (integer ) 2 127.0.0.1:6379> ZRANGE destst 0 -1 WITHSCORES 1) "c" 2) "10" 3) "b" 4) "8"
获取有序集合并集 1 2 3 4 127.0.0.1:6379> ZADD myz 1 a 2 b 3 c 4 d (integer ) 4 127.0.0.1:6379> ZADD myz1 5 e 6 b 7 c 8 f (integer ) 4
ZUNION numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES] 返回多个有序集合的并集并移除相同的成员只保留一个, 不存在的 key 被当作空集合, 集合都为空返回 (empty array), Redis 6.2.0 支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> ZUNION 2 myz myz1 WEIGHTS 2 3 WITHSCORES 1) "a" 2) "2" 3) "d" 4) "8" 5) "e" 6) "15" 7) "b" 8) "22" 9) "f" 10) "24" 11) "c" 12) "27"
ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 计算多个有序集合的并集将结果存储到指定集合并返回保存到指定集合的成员数量, 如果指定集合不存在则新建, 如果指定集合已存在则覆盖指定集合, 0 表示未找到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0.0.1:6379> ZUNIONSTORE destst 2 myz myz1 WEIGHTS 3 4 AGGREGATE MIN (integer ) 6 127.0.0.1:6379> ZRANGE destst 0 -1 WITHSCORES 1) "a" 2) "3" 3) "b" 4) "6" 5) "c" 6) "9" 7) "d" 8) "12" 9) "e" 10) "20" 11) "f" 12) "32"
应用