目录
Set
基本命令
sadd
SMEMBERS
SISMEMBER
SCARD
返回值:
SPOP
SMOVE
SREM
集合间操作
交集:
并集:
差集:
编辑
内部编码
使用场景:
Zset 有序集合
Zset基本命令
ZADD
ZCARD
ZCOUNT
ZRANGE
ZREVRANGE
ZRANGEBYSCORE
ZPOPMAX
BZPOPMAX
编辑
ZPOPMIN
ZRANK
ZREVRANK
ZSCORE
ZREM
ZREMRANGEBYRANK
ZREMRANGEBYSCORE
ZINCRBY
集合间操作
ZINTERSTORE
ZUNIONSTORE
内部编码
使用场景
Set
SET
是一个强大的数据结构,适合用于存储不重复的元素并执行高效的集合操作。1. 无序集合
Redis 的
SET
是一个无序集合,它不保存任何元素的顺序。当你存储数据时,Redis 会在内部管理这些元素,但不保证它们的顺序。2. 唯一性
SET
内的元素是唯一的,即集合中的每个元素不能重复。如果你尝试向一个集合中添加已存在的元素,Redis 会自动忽略这个操作。
基本命令
sadd
将一个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中。
语法:
SADD key member [member ...]
127.0.0.1:6379> sadd key a b c d e f a b c d 6 127.0.0.1:6379> smembers key d e c a f b
返回值:
- 如果成员成功添加到集合中,则返回被添加的成员的数量(即新加入集合的成员数,忽略已经存在的成员)。
- 如果一个成员已经存在于集合中,它不会被重新添加,
SADD
不会计入该成员。
SMEMBERS
SMEMBERS
是一个用于获取集合(Set)中所有成员的命令。Redis 中的集合是一个无序且不重复的元素集合。127.0.0.1:6379> sadd key a b c d e f a b c d 6 127.0.0.1:6379> smembers key d e c a f b
返回值:
- 如果集合存在且有成员,
SMEMBERS
返回集合中的所有成员,顺序不固定,因为 Redis 中的集合是无序的。- 如果集合为空,返回一个空的列表(
[]
)。- 如果该键不存在,返回空集合。
SISMEMBER
SISMEMBER用于检查给定的成员是否存在于指定的集合(Set)中
语法:
SISMEMBER key member
127.0.0.1:6379> sismember key a 1 127.0.0.1:6379> sismember key s 0
返回值:
- 1:如果该成员存在于集合中。
- 0:如果该成员不存在于集合中。
- (integer) 0 or 1:返回整数
0
或1
,表示成员是否在集合中。
SCARD
S
CARD
命令用于获取集合(Set)中元素的数量,也就是集合的基数(cardinality)。语法:
SCARD key
127.0.0.1:6379> scard key 6
返回值:
- 整数值:返回集合中元素的数量(即集合的基数)。如果集合为空,返回
0
。- 如果指定的
key
不存在,Redis 会返回0
,因为 Redis 会认为一个不存在的集合相当于一个空集合。
SPOP
SPOP
命令用于从集合(Set)中随机移除并返回一个或多个元素。如果集合为空,则命令会返回空结果。语法:
SPOP key [count]
127.0.0.1:6379> spop key 2 f c 127.0.0.1:6379> spop key 1 b 127.0.0.1:6379> spop key 12 a d e
返回值:
- 单个元素:如果未指定
count
,则返回集合中随机移除的一个元素。- 多个元素:如果指定了
count
,则返回一个列表,包含随机移除的多个元素。- 如果集合为空或键不存在,则返回
(nil)
。
SMOVE
SMOVE
命令用于将一个元素从一个集合(Set)移动到另一个集合。具体来说,它会从源集合中移除该元素,并将该元素添加到目标集合中。这个操作是 原子性的,即要么成功完成,要么失败。语法:
SMOVE source destination member
127.0.0.1:6379> sadd key a b c d e f 6 127.0.0.1:6379> smove key key1 a 1 127.0.0.1:6379> smembers key1 a
返回值:
1
:如果元素成功移动到目标集合。0
:如果元素不在源集合中,或者没有成功移动。
SREM
SREM
是一个用于从集合(set)中移除指定成员的命令。语法:
SREM key member [member ...]
127.0.0.1:6379> sadd key a b c d e f 6 127.0.0.1:6379> smembers key c b d e a f 127.0.0.1:6379> srem key a b c d 4 127.0.0.1:6379> smembers key e f
返回值
- 如果集合中存在该成员并成功删除,返回 1。
- 如果集合中不存在该成员,返回 0。
- 如果成员有多个,则会返回删除的成员数量。
集合间操作
交集(inter)、并集(union)、差集(diff)的概念如图
交集:
SINTER
SINTER用于计算 多个集合的交集。它返回的是所有输入集合中都存在的元素。
语法:
SINTER key1 key2 [key3 ...]
127.0.0.1:6379> sadd key1 a b c d e f 6 127.0.0.1:6379> sadd key2 a b c i j k 6 127.0.0.1:6379> sinter key1 key2 c b a
SINTERSTORE
语法:SINTERSTORE destination key1 key2 [key3 ...]
127.0.0.1:6379> sinterstore key3 key1 key2 3 127.0.0.1:6379> smembers key3 a c b
返回值
- 整数:
SINTERSTORE
返回一个整数,表示目标集合中包含的成员数量(即交集中的元素数)。
并集:
SUNION用于 计算多个集合的并集,即返回所有参与集合中的元素,去重后的结果。
语法:
SUNION key1 key2 [key3 ...]
127.0.0.1:6379> sadd key1 a b c d e f 6 127.0.0.1:6379> sadd key2 a b c i j k 6 127.0.0.1:6379> sunion key1 key2 i d e c a f k b j
SUNIONSTORE
获取给定 set 的并集中的元素并保存到⽬标 set 中。
语法:
SUNIONSTORE destination key [key ...]
127.0.0.1:6379> sunionstore key3 key1 key2 9 127.0.0.1:6379> smembers key3 i d e c a f k b j
差集:
SDIFF用于计算 多个集合之间的差集。它返回的是在一个集合中存在但不在其他集合中存在的元素。简单来说,
SDIFF
用于找出某些集合与其他集合的不同部分。语法:
SDIFF key1 key2 [key3 ...]
127.0.0.1:6379> sadd key1 a b c d e f 6 127.0.0.1:6379> sadd key2 a b c i j k 6 127.0.0.1:6379> sdiff key1 key2 d f e 127.0.0.1:6379> sdiff key2 key1 i j k
返回值:
SDIFF
命令返回的是 所有集合的差集,即那些仅存在于第一个集合中的元素,其他集合中不存在的元素。
SDIFFSTORE
SDIFFSTORE
是一个用于计算多个集合(set)之间差集并将结果保存到另一个集合中的命令。它的功能是找出一个或多个集合与其他集合的差异,并将这个差异保存到指定的集合中。语法:
SDIFFSTORE destination key1 key2 [keyN]
127.0.0.1:6379> sdiffstore key3 key1 key2 3 127.0.0.1:6379> smembers key3 d f e 127.0.0.1:6379> sdiffstore key4 key2 key1 3 127.0.0.1:6379> smembers key4 i j k
返回值
SDIFFSTORE
返回的是计算出的差集结果的元素数量,也就是目标集合中元素的个数。
内部编码
集合类型的内部编码有两种:
- intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从而减少内存的使用。
- hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合的内部实现。
使用场景:
集合类型比较典型的使⽤场景是标签(tag)。例如 A 用户对娱乐、体育板块比较感兴趣,B 用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签的人,以及用户的共同喜好的标签,这些数据对于增强还有体验和用户黏度都非常有帮助。
Zset 有序集合
在 Redis 中,Zset(有序集合)是一种基于哈希表和跳表(skip list)的数据结构,它将元素和对应的分数(score)关联在一起,按照分数进行排序。
Zset 的特点是:每个元素都有一个唯一的分数,并且所有的元素都能按照分数进行排序,分数相同的元素会按照字典顺序排序。Zset 既能高效地支持排名查询,又能提供快速的范围查询。
Zset 的基本结构
- 元素:每个元素是一个唯一的成员,可以是任意的字符串。
- 分数:每个元素都关联一个浮动的分数,用于排序。分数是浮点数类型,可以是负数或者正数。
提醒:
可查看中文
Zset基本命令
ZADD
ZADD
是向有序集合(ZSET)中添加一个或多个成员及其分数的命令。如果该成员已经存在,则更新其分数;如果不存在,则将成员添加到集合中。命令格式:
ZADD key [NX|XX] [CH] score member [score member ...]
说明
key
: 有序集合的键(ZSET的名字)。score
: 分数值,用于排序,分数值可以是整数或浮动的数字。member
: 要添加的成员(元素)。[NX|XX]
(可选):
NX
: 只有在成员不存在时才添加。XX
: 只有在成员已经存在时才更新。[CH]
(可选):
CH
: 返回值包含被修改的成员个数,而不仅仅是新增的成员个数。score member ...
: 可以同时添加多个元素,每个元素都有一个分数。返回值
- 返回添加到ZSET的成员数量,不包括那些已经存在且分数未发生变化的成员。
基本用法:
127.0.0.1:6379> zadd key1 90 英语 80 数学 50 语文 3 127.0.0.1:6379> zrange key1 0 -1 withscores 语文 50 数学 80 英语 90 127.0.0.1:6379> zadd key1 100 语文 0 127.0.0.1:6379> zrange key1 0 -1 withscores 数学 80 英语 90 语文 100
NX 和 XX 用法:
NX:只在成员不存在时才添加:
127.0.0.1:6379> zadd key1 nx 99 化学 1 127.0.0.1:6379> zrange key1 0 -1 数学 英语 化学 语文 127.0.0.1:6379> zadd key1 nx 90 化学 0 127.0.0.1:6379> zrange key1 0 -1 withscores 数学 80 英语 90 化学 99 语文 100
XX:只在成员已存在时才更新:
127.0.0.1:6379> zadd key1 xx 100 化学 0 127.0.0.1:6379> zrange key1 0 -1 withscores 数学 80 英语 90 化学 100 语文 100
使用 CH
默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
127.0.0.1:6379> zadd key1 ch 40 物理 15 体育 60 化学 3 127.0.0.1:6379> zrange key1 0 -1 withscores 体育 15 物理 40 化学 60 数学 80 英语 90 语文 100
扩展命令:ZINCRBY
此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数
127.0.0.1:6379> zadd key1 incr 44 体育 59 127.0.0.1:6379> zrange key1 0 -1 withscores 物理 40 体育 59 化学 60 数学 80 英语 90 语文 100
ZCARD
ZCARD
命令返回指定有序集合中的成员数量。语法:
ZCARD key
127.0.0.1:6379> zrange key1 0 -1 withscores 物理 40 体育 59 化学 60 数学 80 英语 90 语文 100 127.0.0.1:6379> zcard key1 6 127.0.0.1:6379> zcard key2 0
返回值:
- 返回一个整数,表示有序集合中成员的个数。如果指定的
key
不存在,返回值为0
。
ZCOUNT
返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:
ZCOUNT key min max
key
:有序集合的名称(或键)。
min
:查询的最小分数,可以是整数或浮动的数值。
max
:查询的最大分数,也可以是整数或浮动的数值。
min
和max
的范围表示:
分数的范围可以使用特殊符号:
-inf
表示负无穷,表示没有下限。
+inf
表示正无穷,表示没有上限。可以使用
[
和]
来表示区间的闭合或开区间:
[min,max]
表示闭区间,包含min
和max
。
(min,max)
表示开区间,不包含min
和max
。
[min,max)
表示左闭右开区间,包含min
但不包含max
。
(min,max]
表示左开右闭区间,不包含min
但包含max
。返回值:
返回 有序集合 中分数在指定区间内的成员数量。
ZRANGE
用来根据索引范围从有序集合中获取元素,返回的元素按其分数(score)从低到高排序。
语法:
ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrange key1 0 -1 物理 体育 化学 数学 英语 语文 127.0.0.1:6379> zrange key1 0 -1 withscores 物理 40 体育 59 化学 60 数学 80 英语 90 语文 100
返回值:
默认情况下,
ZRANGE
会返回指定范围内的成员列表(按照分数从低到高排序)。如果指定了
WITHSCORES
,则返回成员以及它们对应的分数。
ZREVRANGE
返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。
语法:ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrevrange key1 0 -1 语文 英语 数学 化学 体育 物理 127.0.0.1:6379> zrevrange key1 0 -1 withscores 语文 100 英语 90 数学 80 化学 60 体育 59 物理 40
返回值
- 如果没有指定
WITHSCORES
,返回的是有序集合中的成员(按分数降序排列)。- 如果指定了
WITHSCORES
,返回的是成员和对应的分数对(每个成员后面跟着其分数)。
ZRANGEBYSCORE
根据成员的分数范围返回有序集合中指定分数区间内的所有元素。这个命令非常适合用于需要按分数范围查询并获取排名的场景。
语法:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> zrangebyscore key1 40 60 物理 体育 化学 127.0.0.1:6379> zrangebyscore key1 70 100 withscores 数学 80 英语 90 语文 100
返回值
- 普通返回:返回在指定分数范围内的成员(仅包含成员,不包含分数)。
- WITHSCORES 选项:返回的结果是一个列表,包含成员和它们对应的分数,格式为
[member, score, member, score, ...]
。- LIMIT 选项:限制返回的结果,从指定的偏移量
offset
开始,返回最多count
个元素。
ZPOPMAX
ZPOPMAX删除并返回分数最⾼的 count 个元素。
语法:ZPOPMAX key [count]
127.0.0.1:6379> zrange key1 0 -1 withscores 物理 40 体育 59 化学 60 数学 80 英语 90 语文 100 127.0.0.1:6379> zpopmax key1 1 语文 100 127.0.0.1:6379> zpopmax key1 2 英语 90 数学 80 127.0.0.1:6379> zpopmax key1 化学 60
返回值
- 如果未指定
count
,返回一个包含单个元素的列表,其中元素是一个由成员和分数组成的列表([member, score]
)。- 如果指定了
count
,返回的列表将包含多个成员及其对应的分数,按分数降序排列。
BZPOPMAX
ZPOPMAX 的阻塞版本。
语法:BZPOPMAX key [key ...] timeout
返回值:
如果命令成功执行,返回一个包含两部分的数组:
- key:从哪个有序集合弹出的元素。
- member:弹出的元素的成员。
- score:弹出的成员的分数。
ZPOPMIN
ZPOPMIN删除并返回分数最低的 count 个元素。
语法:
ZPOPMIN key [count]
127.0.0.1:6379> zadd key 100 Math 90 English 80 Sport 3 127.0.0.1:6379> zrange key 0 -1 withscores Sport 80 English 90 Math 100 127.0.0.1:6379> zpopmin key 2 Sport 80 English 90
返回值:
- 如果不指定
count
,返回一个包含移除的成员及其分值的数组。- 如果指定了
count
,则最多返回count
个成员及其分值。
BZPOPMIN同理BZPOPMAX
ZRANK
返回指定元素的排名,升序。
语法:
ZRANK key member
127.0.0.1:6379> zadd key 15 张三 18 李四 19 王五 12 赵六 4 127.0.0.1:6379> zrange key 0 -1 withscores 赵六 12 张三 15 李四 18 王五 19 127.0.0.1:6379> zrank key 张三 1 127.0.0.1:6379> zrank key 王五 3 127.0.0.1:6379> zrank key 赵六 0 127.0.0.1:6379> zrank key 小七 127.0.0.1:6379>
返回值:
- 整数:如果成员存在,返回该成员在有序集合中的排名(从 0 开始)。
- nil:如果成员不存在于该有序集合中,返回
nil
。
ZREVRANK
ZREVRANK返回指定元素的排名,降序
语法:
ZREVRANK key member
127.0.0.1:6379> zrange key 0 -1 withscores 赵六 12 张三 15 李四 18 王五 19 127.0.0.1:6379> zrevrank key 赵六 3 127.0.0.1:6379> zrevrank key 王五 0 127.0.0.1:6379> zrevrank key 哈哈
返回值:
- 整数:如果成员存在于有序集合中,返回该成员的反向排名(从 0 开始)。即成员的分数较高时,排名靠前,分数较低时排名靠后。
- nil:如果成员不存在于该有序集合中,返回
nil
。
ZSCORE
ZSCORE返回指定元素的分数
语法:ZSCORE key member
127.0.0.1:6379> zrange key 0 -1 withscores 赵六 12 张三 15 李四 18 王五 19 127.0.0.1:6379> zscore key 张三 15 127.0.0.1:6379> zscore key 李四 18 127.0.0.1:6379> zscore key hh
返回值:
- 浮动数值:如果成员存在,返回该成员的分数。
- nil:如果成员不存在于有序集合中,返回
nil
。
ZREM
ZREM删除指定的元素。
语法:ZREM key member [member ...]
127.0.0.1:6379> zrange key 0 -1 withscores 赵六 12 张三 15 李四 18 王五 19 127.0.0.1:6379> zrem key 张三 李四 2 127.0.0.1:6379> zrange key 0 -1 赵六 王五
返回值:
- 整数:返回成功移除的成员数量。
- 如果成员存在并成功移除,返回的数字是移除的成员数量。
- 如果某个成员不存在,
ZREM
仍然会忽略这个成员,不会报错,但不会计入移除的数量。
ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,左闭右闭。
语法:
ZREMRANGEBYRANK key start stop
127.0.0.1:6379> zadd key 80 英语 50 语文 30 数学 28 体育 49 美术 5 127.0.0.1:6379> zrange key 0 -1 体育 数学 美术 语文 英语 127.0.0.1:6379> zremrangebyrank key 10 50 0 127.0.0.1:6379> zremrangebyrank key 0 3 4 127.0.0.1:6379> zrange key 0 -1 英语
返回值:
- 整数:返回被成功移除的成员数量。
ZREMRANGEBYSCORE
ZREMRANGEBYSCORE按照分数删除指定范围的元素,左闭右闭。
语法:
ZREMRANGEBYSCORE key min max
127.0.0.1:6379> zadd key 80 英语 50 语文 30 数学 28 体育 49 美术 5 127.0.0.1:6379> zremrangebyscore key 10 50 4 127.0.0.1:6379> zrange key 0 -1 withscores 英语 80
返回值:
- 该命令返回一个整数,表示实际删除的元素数量。
ZINCRBY
为指定的元素的关联分数添加指定的分数值。
语法:
ZINCRBY key increment member
127.0.0.1:6379> zincrby key 100 英语 180 127.0.0.1:6379> zscore key 英语 180
返回值:
ZINCRBY
命令返回的是 成员的更新后的分数。
集合间操作
ZINTERSTORE
求出给定有序集合中元素的交集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。
语法:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
功能:
ZINTERSTORE
用于计算多个有序集合的交集,并将结果存储到目标有序集合中。交集是通过各个集合中成员的分数进行计算的,只有在所有参与的集合中都存在的成员才会被保留下来。- 该命令支持 加权(使用
WEIGHTS
),可以让每个集合的分数对交集结果产生不同的影响。- 还支持 聚合方法(使用
AGGREGATE
),可以选择使用SUM(默认)
、MIN
或MAX
作为聚合方式。127.0.0.1:6379> zadd key1 140 英语 120 语文 110 数学 100 政治 90 历史 5 127.0.0.1:6379> zadd key2 120 英语 100 语文 140 数学 90 物理 100 化学 5 127.0.0.1:6379> zinterstore key3 2 key1 key2 3 127.0.0.1:6379> zrange key3 0 -1 withscores 语文 220 数学 250 英语 260 127.0.0.1:6379> zinterstore key4 2 key1 key2 weights 2 2 3 127.0.0.1:6379> zrange key4 0 -1 withscores 语文 440 数学 500 英语 520 127.0.0.1:6379> zinterstore key5 2 key1 key2 aggregate max 3 127.0.0.1:6379> zrange key5 0 -1 withscores 语文 120 数学 140
返回值:
ZINTERSTORE
命令返回值是 目标集合中存储的成员数量。
有序集合的并集操作
ZUNIONSTORE
求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。语法:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
127.0.0.1:6379> zadd key1 140 英语 120 语文 110 数学 100 政治 90 历史 80 地理 6 127.0.0.1:6379> zadd key2 120 英语 100 语文 140 数学 90 物理 100 化学 90 生物 6 127.0.0.1:6379> zunionstore key3 2 key1 key2 9 127.0.0.1:6379> zrange key3 0 -1 withscores 地理 80 历史 90 物理 90 生物 90 化学 100 政治 100 语文 220 数学 250 英语 260 127.0.0.1:6379> zunionstore key3 2 key1 key2 aggregate max 9 127.0.0.1:6379> zrange key3 0 -1 withscores 地理 80 历史 90 物理 90 生物 90 化学 100 政治 100 语文 120 数学 140 英语 140
返回值:目标集合中的元素个数
内部编码
有序集合类型的内部编码有两种:
• ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会用 ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。 • skiplist(跳表):当 ziplist 条件不满足时,有序集合会使用 skiplist 作为内部实现,因为此时ziplist 的操作效率会下降。
使用场景
有序集合比较典型的使用场景就是排行榜系统。例如常见的网站上的热榜信息,榜单的维度可能是多方面的:按照时间、按照阅读量、按照点赞量。
列表、集合、有序集合三者的异同点