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

热门相关:完美再遇   我能改变东西颜色   大师救命   从现代飞升以后   吹神