
一 Set 型 Value 操作命令
1.1 概述
- Redis 存储数据的 Value 可以是一个 Set 集合,且集合中的每一个元素均 String 类型。Set与 List 非常相似,但不同之处是 Set 中的元素具有无序性与不可重复性,而 List 则具有有序性与可重复性。
- Redis 中的 Set 集合与 Java 中的 Set 集合的实现相似,其底层都是 value 为 null 的 hash表。因此,才会拥有无序性与不可重复性。
命令 | 解释 |
---|---|
sadd | 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 |
smembers | 返回集合 key 中的所有成员 |
scard | 返回 Set 集合的长度 |
sismember | 判断 member 元素是否集合 key 的成员 |
smove | 将 member 元素从 source 集合移动到 destination 集合 |
srem | 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略,且返回成功移除的元素个数 |
srandmember | 返回集合中的 count 个随机元素。count 默认值为 1 |
spop | 移除并返回集合中的 count 个随机元素。count 必须为正数,且默认值为 1 |
sdiff / sdiffstore | 返回第一个集合与其它集合之间的差集。差集,difference |
sinter / sinterstore | 返回多个集合间的交集(intersection) |
sunion / sunionstore | 返回多个集合间的并集(union) |
1.2 sadd
- 格式:
SADD key member [member ...]
- 功能:将一个或多个
member
元素加入到集合key
当中,已经存在于集合的member
元素将被忽略。 - 说明:假如
key
不存在,则创建一个只包含member
元素作成员的集合。当key
不是集合类型时,返回一个错误。
1.3 smembers
- 格式:
SMEMBERS key
- 功能:返回集合
key
中的所有成员。 - 说明:不存在的
key
被视为空集合。若key
中包含大量元素,则该命令可能会阻塞Redis
服务。所以生产环境中一般不使用该命令,而使用sscan
命令代替。
1.4 scard
- 格式:
SCARD key
- 功能:返回
Set
集合的长度 - 说明:当
key
不存在时,返回0
。
1.5 sismember
- 格式:
SISMEMBER key member
- 功能:判断
member
元素是否集合key
的成员。 - 说明:如果
member
元素是集合的成员,返回1
。如果member
元素不是集合的成员,或key
不存在,返回0
。
1.6 smove
- 格式:
SMOVE source destination member
- 功能:将
member
元素从source
集合移动到destination
集合。 - 说明:如果 source 集合不存在或不包含指定的
member
元素,则SMOVE
命令不执行任何操作,仅返回0
。否则,member
元素从source
集合中被移除,并添加到destination
集合中去,返回1
。当destination
集合已经包含member
元素时,SMOVE
命令只是简单地将source
集合中的member
元素删除。当source
或destination
不是集合类型时,返回一个错误。
1.7 srem
- 格式:
SREM key member [member ...]
- 功能:移除集合
key
中的一个或多个member
元素,不存在的member
元素会被忽略,且返回成功移除的元素个数。 - 说明:当
key
不是集合类型,返回一个错误。
1.8 srandmember
- 格式:
SRANDMEMBER key [count]
- 功能:返回集合中的
count
个随机元素。count
默认值为1
。 - 说明:若 count 为正数,且小于集合长度,那么返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合长度,那么返回整个集合。如果count 为负数,那么返回一个包含 count 绝对值个元素的数组,但数组中的元素可能会出现重复。
1.9 spop
- 格式:
SPOP key [count]
- 功能:移除并返回集合中的
count
个随机元素。count
必须为正数,且默认值为1
。 - 说明:如果 count 大于等于集合长度,那么移除并返回整个集合。
1.10 sdiff / sdiffstore
- 格式:
SDIFF key [key ...] 或 SDIFFSTORE destination key [key ...]
- 功能:返回第一个集合与其它集合之间的差集。差集,
difference
。 - 说明:这两个命令的不同之处在于,
sdiffstore
不仅能够显示差集,还能将差集存储到指定的集合destination
中。如果destination
集合已经存在,则将其覆盖。不存在的key
被视为空集。
1.11 sinter / sinterstore
- 格式:
SINTER key [key ...] 或 SINTERSTORE destination key [key ...]
- 功能:返回多个集合间的交集(intersection)。
- 说明:这两个命令的不同之处在于,
sinterstore
不仅能够显示交集,还能将交集存储到指定的集合destination
中。如果destination
集合已经存在,则将其覆盖。不存在的 key 被视为空集。
1.12 sunion / sunionstore
- 格式:
SUNION key [key ...] 或 SUNIONSTORE destination key [key ...]
- 功能:返回多个集合间的并集(union)。
- 说明:这两个命令的不同之处在于,
sunionstore
不仅能够显示并集,还能将并集存储到指定的集合destination
中。如果destination
集合已经存在,则将其覆盖。不存在的 key 被视为空集。
1.13 应用场景
1.13.1 动态黑白名单
- 服务器中要设置用于访问控制的黑名单。如果直接将黑名单写入服务器的配置文件,无法动态修改黑名单。此时可以将黑名单直接写入 Redis,只要有客户端来访问服务器,服务器在获取到客户端 IP后先从 Redis的黑名单中查看是否存在该 IP,如果存在,则拒绝访问,否则访问通过。
1.13.2 有限随机数
- 有限随机数:返回的随机数是基于某一集合范围内的随机数。通过
spop
或srandmember
可以实现从指定集合中随机选出元素。
1.13.3 用户画像
- 社交平台、电商平台等各种需要用户注册登录的平台,会根据用户提供的资料与用户使用习惯,为每个用户进行画像,即为每个用户定义很多可以反映该用户特征的标签,这些标签就可以使用
sadd
添加到该用户对应的集合中。【这些标签具有无序、不重复特征。】同时平台还可以使用sinter/sinterstore
根据用户画像间的交集进行好友推荐、商品推荐、客户推荐等。
二 有序 Set 型 Value 操作命令
2.1 概述
- Redis 存储数据的 Value 可以是一个有序 Set,这个有序 Set 中的每个元素均 String 类型。
- 有序 Set 与 Set 的不同之处是,有序 Set 中的每一个元素都有一个分值 score,Redis 会根据score 的值对集合进行由小到大的排序。其与 Set 集合要求相同,元素不能重复,但元素的score 可以重复。由于该类型的所有命令均是字母 z 开头,所以该 Set 也称为 ZSet。
命令 | 解释 |
---|---|
zadd | 将一个或多个member 元素及其 score 值加入到有序集 key 中的适当位置 |
zrange 与 zrevrange | 返回有序集 key 中,指定区间内的成员。 |
zrangebyscore 与 zrevrangebyscore | 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或max )的成员。 |
zcard | 返回集合的长度 |
zcount | 返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 |
zscore | 返回有序集 key 中,成员 member 的 score 值。 |
zincrby | 为有序集 key 的成员 member 的 score 值加上增量 increment 。 |
zrank 与 zrevrank | 返回有序集 key 中成员 member 的排名。zrank 命令会按 score 值递增排序,zrevrank 命令会按 score 递减排序。 |
zrem | 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。 |
zremrangebyrank | 移除有序集 key 中,指定排名(rank)区间内的所有成员。 |
zremrangebyscore | 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或max )的成员。 |
zrangebylex | 该命令仅适用于集合中所有成员都具有相同分值的情况。 |
zlexcount | 该命令仅适用于集合中所有成员都具有相同分值的情况。 |
zremrangebylex | 该命令仅适用于集合中所有成员都具有相同分值的情况。 |
2.2 zadd
- 格式:
ZADD key score member [[score member] [score member] ...]
- 功能:将一个或多个
member
元素及其score
值加入到有序集key
中的适当位置。 - 说明:
score
值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行ZADD
操作。当 key 存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的member
值已经存在,但score
值不同,则新的score
值将覆盖老score
。
2.3 zrange 与 zrevrange
- 格式:
ZRANGE key start stop [WITHSCORES] 或 ZREVRANGE key start stop [WITHSCORES]
- 功能:返回有序集
key
中,指定区间内的成员。zrange
命令会按 score 值递增排序,zrevrange
命令会按score
递减排序。具有相同score
值的成员按字典序/逆字典序排列。可以通过使用WITHSCORES
选项,来让成员和它的score
值一并返回。 - 说明:
- 下标参数从 0 开始,即 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。也可以使用负数下标,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。超出范围的下标并不会引起错误。
- 如,当 start 的值比有序集的最大下标还要大,或是 start >stop 时,ZRANGE 命令只是简单地返回一个空列表。再比如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。若 key 中指定范围内包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用 zscan 命令代替。
2.4 zrangebyscore 与 zrevrangebyscore
- 格式:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
或ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- 功能:返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或max )的成员。有序集成员按 score 值递增/递减次序排列。具有相同 score 值的成员按字典序/逆字典序排列。可选的 LIMIT 参数指定返回结果的数量及区间(就像 SQL 中的SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
- 说明:min 和 max 的取值是正负无穷大的。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),也可以通过给参数前增加左括号“(”来使用可选的开区间 (小于或大于)。
2.5 zcard
- 格式:
ZCARD key
- 功能:返回集合的长度
- 说明:当 key 不存在时,返回 0 。
2.6 zcount
- 格式:
ZCOUNT key min max
- 功能:返回有序集 key 中,
score
值在min
和max
之间(默认包括score
值等于min
或max
)的成员的数量。
2.7 zscore
- 格式:
ZSCORE key member
- 功能:返回有序集
key
中,成员member
的score
值。 - 说明:如果
member
元素不是有序集 key 的成员,或 key 不存在,返回 nil
2.8 zincrby
- 格式:
ZINCRBY key increment member
- 功能:为有序集
key
的成员member
的score
值加上增量increment
。increment 值可以是整数值或双精度浮点数。 - 说明:可以通过传递一个负数值 increment ,让 score 减去相应的值。当 key 不存在,或 member 不是 key 的成员时,
ZINCRBY key increment member
等同于ZADD key increment member
。当 key 不是有序集类型时,返回一个错误。命令执行成功,则返回 member 成员的新 score 值。
2.9 zrank 与 zrevrank
- 格式:
ZRANK key member 或 ZREVRANK key member
- 功能:返回有序集
key
中成员member
的排名。zrank
命令会按score
值递增排序,zrevrank
命令会按score
递减排序。 - 说明:
score
值最小的成员排名为0
。如果member
不是有序集key
的成员,返回nil
。
2.10 zrem
- 格式:
ZREM key member [member ...]
- 功能:移除有序集
key
中的一个或多个成员,不存在的成员将被忽略。 - 说明:当
key
存在但不是有序集类型时,返回一个错误。执行成功,则返回被成功移除的成员的数量,不包括被忽略的成员。
2.11 zremrangebyrank
- 格式:
ZREMRANGEBYRANK key start stop
- 功能:移除有序集
key
中,指定排名(rank)区间内的所有成员。 - 说明:排名区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。排名区间参数从 0 开始,即 0 表示排名第一的成员, 1 表示排名第二的成员,以此类推。也可以使用负数表示,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。命令执行成功,则返回被移除成员的数量。
2.12 zremrangebyscore
- 格式:
ZREMRANGEBYSCORE key min max
- 功能:移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或max )的成员。
- 说明:命令执行成功,则返回被移除成员的数量。
2.13 zrangebylex
- 格式:
ZRANGEBYLEX key min max [LIMIT offset count]
- 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序。即这个命令返回给定集合中元素值介于 min 和 max 之间的成员。如果有序集合里面的成员带有不同的分值, 那么命令的执行结果与 zrange key 效果相同。
- 说明:合法的 min 和 max 参数必须包含左小括号“(”或左中括号“[”,其中左小括号“(”表示开区间, 而左中括号“[”则表示闭区间。min 或max 也可使用特殊字符“+”和“-”,分别表示正无穷大与负无穷大。
2.14 zlexcount
- 格式:
ZLEXCOUNT key min max
- 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令返回该集合中元素值本身(而非 score 值)介于 min 和 max 范围内的元素数量。
2.15 zremrangebylex
- 格式:
ZREMRANGEBYLEX key min max
- 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令会移除该集合中元素值本身介于 min 和 max 范围内的所有元素
2.16 应用场景
- 有序 Set 最为典型的应用场景就是排行榜,例如音乐、视频平台中根据播放量进行排序的排行榜;电商平台根据用户评价或销售量进行排序的排行榜等。将播放量作为 score,将作品 id 作为 member,将用户评价积分或销售量作为 score,将商家 id 作为 member。使用zincrby 增加排序 score,使用 zrevrange 获取 Top 前几名,使用 zrevrank 查询当前排名,使用zscore 查询当前排序 score 等。