Redis基础知识(学习笔记10--Redis命令(3))
六. Set型Value操作命令
Reids存储数据的Value可以是一个Set集合,且集合中的每一个元素均为String类型,Set与List非常相似,当不同之处是Set中的元素具有无序性与不可重复性,而List具有有序性与可重复性。
Redis中的Set集合与Java中的Set集合的实现相似,其底层都是value为null的hash表,也正因为此,才会引发无序性与不可重复性。
6.1 sadd
>sadd key member [member ... ]
将一个或多个member元素加入到集合key当中,已经存在集合的member元素被忽略。
说明:加入key不存在,在创建一个只包含member元素作为成员的集合,当key不是集合类型时,返回一个错误。
6.2 smembers
>smembers key
返回集合key中的所有成员。
说明:不存在的key被视为空集合。若key中包含大量元素,则该命令可能会阻塞Redis服务。所以生产环境中一般不适用该命令,而使用sscan命令替代。
6.3 scard
>scard key
返回set集合的长度。
说明:当key不存在时,返回0.
6.4 sismember
>sismember key member
判断member元素是否是集合key的成员。
说明:如果member元素是集合的成员,则返回1。如果member元素不是集合的成员,或key不存在,则返回0。
6.5 smove
>smove source destination member
将member 元素从source 集合移动到destination集合。
说明:如果source集合不存在或者不包含指定的member元素,则smove命令不执行任何操作,仅返回0。否则,member 元素从source 集合中被移除,并添加到destination集合中去,返回1。当destination集合已经包含了member元素时,smove命令只是简单地将source集合中的member元素删除。当source 或者 destination 不是集合类型时,返回一个错误。
6.6 srem
>srem key member [member ...]
移除集合key中的一个或多个member 元素,不存在的member元素会被忽略,且返回成功移除的元素个数。
说明:当key不是集合类型时,返回一个错误。
6.7 srandmember
>srandmember key [count]
返回集合中count个随机元素。count默认值为1。
说明:若count为正数,且小于集合长度,那么返回一个包含count个元素的数组,数组中的元素各不相同。如果count大于等于集合长度,那么返回整个集合,如果count为负数,那么返回一个包含count绝对值个元素的数组,但数组中的元素可能会出现重复。
6.8 spop
>spop key [count]
移除并返回集合中的count个随机元素。count必须为正数,且默认值为1。
说明:如果count大于等于集合长度,那么移除并返回整个集合。
6.9 sdiff
SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
说明:不存在的 key 被视为空集。返回值:一个包含差集成员的列表。
redis> SMEMBERS peter's_movies 1) "bet man" 2) "start war" 3) "2012" redis> SMEMBERS joe's_movies 1) "hi, lady" 2) "Fast Five" 3) "2012" redis> SDIFF peter's_movies joe's_movies 1) "bet man" 2) "start war"
6.10 sdiffstore
SDIFFSTORE destination key [key ...]
这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
说明:如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。返回值:结果集中的元素数量。
redis> SMEMBERS joe's_movies 1) "hi, lady" 2) "Fast Five" 3) "2012" redis> SMEMBERS peter's_movies 1) "bet man" 2) "start war" 3) "2012" redis> SDIFFSTORE joe_diff_peter joe's_movies peter's_movies (integer) 2 redis> SMEMBERS joe_diff_peter 1) "hi, lady" 2) "Fast Five"
6.11 sinter
SINTER key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的交集。
说明:不存在的 key 被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。返回值:交集成员的列表。
6.12 sinterstore
SINTERSTORE destination key [key ...]
这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
说明:如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。返回值:结果集中的成员数量。
6.13 sunion
SUNION key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的并集。
说明:不存在的 key 被视为空集。返回值:并集成员的列表。
6.14 sunionstore
SUNIONSTORE destination key [key ...]
这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
说明:如果 destination 已经存在,则将其覆盖。destination 可以是 key 本身。返回值:结果集中的元素数量。
6.15 应用场景
(1)动态黑白名单
例如某服务器中要设置访问控制的黑名单,如果直接将黑名单写入服务器的配置文件,那么存在的问题是,无法动态修改黑名单。此时可以将黑名单直接写入redis,只要有客户端访问服务器,服务器在获取到客户端IP后先从redis的黑名单中查看是否存在该IP,如果存在,则拒绝访问,否则予以放行。
(2)有限随机数
有限随机数是指返回的随机数是基于某一集合范围内的随机数,例如抽奖、随机选人。通过spop 或 srandmember可以实现从指定集合中随机选出元素。
(3)用户画像
社交平台、电商平台等各种需要用户注册登录的平台,会根据用户提供的资料与用户使用习惯,为每一个用户进行画像,即为每个用户进行定义很多可以反应该用户特征的标签,这些标签就可以使用sadd添加到该用户对应的集合中。这些标签具有无序、不重复特征。同时,平台还可以使用sinter / sinterstore 根据用户画像的交集进行好友推荐、商品推荐、客户推荐等。
七.有序Set型Value操作命令
Redis存储数据的Value可以是一个有序Set,这个有序Set中的每个元素均为String类型。有序Set与Set的区别是,有序Set中的每一个元素都有一个分值score,redis会根据score的值对集合进行由小到大的排序。其与Set集合要求相同,元素不能重复,但元素的score可以重复,由于该类型的所有命令均是字母z开头,所以该Set也称ZSet。
7.1 zadd
>zadd key score member [[score member] [score member]...]
将一个或多个member 元素及其score值加入到有序集key中的适当位置。
说明:score值可以是整数或双精度浮点数。如果key不存在,则创建一个空的有序并执行zadd操作。当key不存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的member值已经存在,但score值不同,则新的score值将覆盖老score。
7.2 zrange 与 zrevrange
zrange key start stop [withscores] 或 zrevrange key start stop [withscores]
返回有序集key中,指定区间内的成员。zrange命令会按score值递增排序,zrevrange命令会按score递减排序。具有相同score值的成员按字典序/逆字典序排列。加带参数withscores,就是将分值(score)一并带出,即返回结果中youscore。
说明:下标参数从0开始,即0代表有序集第一个成员,以1表示有序集第二个成员,以此类推。也可以使用负数下标,-1表示最后一个成员,-2表示倒数第二个成员,以此类推。超出范围的下标并不会引起错误,例如,当start的值比有序集的最大下标还大,或是start>stop时,zrange命令只是简单地返回一个空列表。再比如stop参数的值比有序集的最大下标还要大,那么redis将stop当作最大下标来处理。
若key中指定范围内包含大量元素,则该命令可能会阻塞redis服务,所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用zscan命令代替。
7.3 zrangebyscore 与 zrevrangebyscore
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
说明:具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ”(“ 符号来使用可选的开区间 (小于或大于)。返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。
说明:具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。
7.4 zcard
>zcard key
返回集合的长度
说明:当key不存在时,返回0。
7.5 zcount
>zcount key min max
返回有序集key中,score值在min 和 max 之间(默认包括score值等于min或max)的成员的数量。
说明:返回值为score
值在 min
和 max
之间的成员的数量。
7.6 zscore
ZSCORE key member
返回有序集 key 中,成员 member 的 score 值。
说明:如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。执行成功,其返回值为 member 成员的 score 值,且以字符串形式表示。# 注意返回值是字符串。
7.7 zincrby
ZINCRBY key increment member
为有序集 key 的成员 member 的 score 值加上增量 increment 。
说明:可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。当 key 不是有序集类型时,返回一个错误。score 值可以是整数值或双精度浮点数。返回值: member 成员的新 score 值,以字符串形式表示。
7.8 zrank 与 zrevrank 【rank是排名的以此】
ZRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
说明:排名以 0 为底,也就是说, score 值最小的成员排名为 0 。使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。返回值:如果 member 是有序集 key 的成员,返回 member 的排名。如果 member 不是有序集 key 的成员,返回 nil 。
ZREVRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
说明:排名以 0 为底,也就是说, score 值最大的成员排名为 0 。使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。返回值:如果 member 是有序集 key 的成员,返回 member 的排名。如果 member 不是有序集 key 的成员,返回 nil 。
7.9 zrem
ZREM key member [member ...]
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
说明:当 key 存在但不是有序集类型时,返回一个错误。执行成功时,返回值为被成功移除的成员的数量,不包括被忽略的成员。
7.10 zremrangebyrank
zremrangebyrank key start stop
移除有序集key中,指定排名(rank)区间内的所有成员。
说明:排名区间分别以下标参数start 和 stop 指出,包含start 和 stop 以内。排名区间参数从0开始,即0表示排名第一的成员,1表示排名第二的成员,以此类推。也可以使用负数来表示,-1 表示最后一个成员,-2 表示排名倒数第二个成员,以此类推。命令执行成功,则返回被移除成员的数量。
7.11 zremrangebyscore
zremrangebyscore key min max [limit offset count]
移除有序集key中,所有score值介于min 和 max之间(包括等于min或max)的成员。
说明:命令执行成功,则返回被移除成员的数量。
7.12 zrangebylex
zrangebylex key min max [limit offset count]
该命令仅适用于集合中所有成员都具有相同分值的情况。当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序。即这个命令返回给定集合中元素介于min 和 max 之间的成员。如果有序集合里面的成员带有不同的分值,那么命令的执行效果和zrange key 一样。
说明:合法的min 和 max 参数必须包含左小括号”(“ 或或左中括号”[“,其中左小括号”(“表示开区间,而左中括号”[“表示闭区间,min或max也可使用特殊字符”+“ 和 ”-“,分别表示正无穷大与负无穷大。
7.13 zlexcount
>zlexcount key min max
该命令仅适用于集合中所有成员都具有相同分值的情况。该命令返回该集合中元素值本身(而非score值)介于min 和 max 范围内的元素数量。
7.14 zremrangebylex
>zremrangebylex key min max
该命令仅适用于集合中所有成员都具有相同分值的情况。该命令会移除该集合中元素值本身介于min 和 max 范围内的所有元素。
7.15 应用场景
有序set最为经典的应用场景就是排行榜,例如音乐、视频平台中根据播放量进行排序的排行榜;电商平台根据用户评价或销售量进行排序的排行榜等。将播放量作为score,将作品id作为member,将用户评价积分或销售量作为score,将商家id作为member。使用zincrby增加排序score,使用zrevrange获取top前几名,使用zrevrank查询查询当前排名,使用zscore查询当前排序score等。
学习参阅声明
1.【Redis视频从入门到高级】
https://www.bilibili.com/video/BV1U24y1y7jF?p=11&vd_source=0e347fbc6c2b049143afaa5a15abfc1c】
2. 【Redis 命令参考】
https://haiyong.site/doc/redis/redis-gh-pages/hash/hscan.html