ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> **Redis-常用类型操作命令2(Set/sorted set)** [TOC] ## 说明 ## **记录以下Redis常用类型的操作命令。** ---------- ##集合介绍## Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。 ## Set ## <h5>SADD(增加元素)</h5> SADD key member [member …] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。 当 key 不是集合类型时,返回一个错误。 返回值:被添加到集合中的新元素的数量,不包括被忽略的元素。 ---------- 127.0.0.1:6379> sadd people zhangsan (integer) 1 127.0.0.1:6379> sadd people zhangsan (integer) 0 127.0.0.1:6379> sadd people lisi (integer) 1 127.0.0.1:6379> smembers people 1) "lisi" 2) "zhangsan" <h5>SISMEMBER(判断是否时集合元素)</h5> SISMEMBER key member:判断 member 元素是否集合 key 的成员。 返回值:如果 member 元素是集合的成员,返回 1 。 如果 member 元素不是集合的成员,或 key 不存在,返回 0 。 ---------- 127.0.0.1:6379> smembers people 1) "lisi" 2) "zhangsan" 127.0.0.1:6379> sismember people lisi (integer) 1 127.0.0.1:6379> sismember people zhaoliu (integer) 0 <h5>SPOP(随机删除元素并返回)</h5> SPOP:移除并返回集合中的一个随机元素。 如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER key [count] 命令。 返回值:被移除的随机元素。 当 key 不存在或 key 是空集时,返回 nil ---------- 127.0.0.1:6379> spop people "lisi" 127.0.0.1:6379> smembers people 1) "zhangsan" <h5>SRANDMEMBER(随机返回元素)</h5> SRANDMEMBER key [count]:如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。 该操作和 SPOP key 相似,但 SPOP key 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。 ---------- 127.0.0.1:6379> srandmember people "lisi" 127.0.0.1:6379> srandmember people "zhangsan" 127.0.0.1:6379> srandmember people "zhangsan" <h5>SREM(删除元素)</h5> SREM key member [member …]:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。 当 key 不是集合类型,返回一个错误。 返回值 被成功移除的元素的数量,不包括被忽略的元素。 ---------- 127.0.0.1:6379> smembers people 1) "zhaoliu" 2) "lisi" 3) "wangwu" 4) "zhangsan" 5) "gouqi" 127.0.0.1:6379> srem people zhangsan (integer) 1 127.0.0.1:6379> smembers people 1) "wangwu" 2) "lisi" 3) "gouqi" 4) "zhaoliu" <h5>SMOVE(移动元素到另外集合)</h5> SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合。 SMOVE 是原子性操作。 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。 当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。 当 source 或 destination 不是集合类型时,返回一个错误。 返回值 如果 member 元素被成功移除,返回 1 。 如果 member 元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0 。 ---------- 127.0.0.1:6379> smembers people 1) "lisi" 2) "wangwu" 3) "gouqi" 4) "zhaoliu" 127.0.0.1:6379> smove people teachers lisi (integer) 1 127.0.0.1:6379> SMEMBERS teachers 1) "lisi" 127.0.0.1:6379> <h5>SCARD(返回集合元素数量)</h5> SCARD key:返回集合 key 的基数(集合中元素的数量)。 ---------- 127.0.0.1:6379> scard teachers (integer) 1 127.0.0.1:6379> scard people (integer) 3 <h5>SMEMBERS(查看集合所有元素)</h5> SMEMBERS key:不存在的 key 被视为空集合。 返回值:集合中的所有成员。 ---------- 127.0.0.1:6379> SMEMBERS teachers 1) "lisi" 127.0.0.1:6379> SMEMBERS people 1) "wangwu" 2) "gouqi" 3) "zhaoliu" <h5>SINTER(返回集合交集)</h5> SINTER key [key …]:返回一个集合的全部成员,该集合是所有给定集合的交集。 不存在的 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。 ---------- 127.0.0.1:6379> SMEMBERS people 1) "wangwu" 2) "gouqi" 3) "zhaoliu" 127.0.0.1:6379> sinter people teachers (empty list or set) 127.0.0.1:6379> sadd teachers wangwu (integer) 1 127.0.0.1:6379> sinter people teachers 1) "wangwu" <h5>SINTERSTORE(将交集保存到集合)</h5> SINTERSTORE destination key [key …]:这个命令类似于 SINTER key [key …] 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。 如果 destination 集合已经存在,则将其覆盖。 destination 可以是 key 本身。 ---------- 127.0.0.1:6379> SMEMBERS people 1) "wangwu" 2) "gouqi" 3) "zhaoliu" 127.0.0.1:6379> sinter people teachers (empty list or set) 127.0.0.1:6379> sadd teachers wangwu (integer) 1 127.0.0.1:6379> sinter people teachers 1) "wangwu" 127.0.0.1:6379> sinterstore newset people teachers (integer) 1 127.0.0.1:6379> smembers newset 1) "wangwu" <h5>SUNION(返回集合并集) </h5> SUNION key [key …]:返回一个集合的全部成员,该集合是所有给定集合的并集。 不存在的 key 被视为空集。 返回值并集成员的列表。 ---------- 127.0.0.1:6379> sunion people teachers 1) "gouqi" 2) "lisi" 3) "zhaoliu" 4) "wangwu" <h5>SUNIONSTORE(将并集保存到集合)</h5> SUNIONSTORE destination key [key …]:这个命令类似于 SUNION key [key …] 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。 如果 destination 已经存在,则将其覆盖。 destination 可以是 key 本身。 ---------- 127.0.0.1:6379> sunionstore peoples people teachers (integer) 2 127.0.0.1:6379> SMEMBERS peoples 1) "lisi" 2) "wangwu" <h5>SDIFF(返回差集)</h5> SDIFF key [key …]:返回一个集合的全部成员,该集合是所有给定集合之间的差集。 不存在的 key 被视为空集。 返回值:一个包含差集成员的列表。 ---------- 127.0.0.1:6379> sdiff people teachers (empty list or set) 127.0.0.1:6379> sadd people zhaoliu (integer) 1 127.0.0.1:6379> sdiff people teachers 1) "zhaoliu" <h5>SDIFFSTORE(保存差集到集合)</h5> SDIFFSTORE destination key [key …]:这个命令的作用和 SDIFF key [key …] 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。 如果 destination 集合已经存在,则将其覆盖。 destination 可以是 key 本身。 返回值:结果集中的元素数量。 ---------- 127.0.0.1:6379> sdiffstore setdiff people teachers (integer) 1 127.0.0.1:6379> SMEMBERS setdiff 1) "zhaoliu" ##有序集合## Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。 ##sorted set## <h5>ZADD</h5> ZADD key score member [[score member] [score member] …]:将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。 score 值可以是整数值或双精度浮点数。 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。 当 key 存在但不是有序集类型时,返回一个错误。 对有序集的更多介绍请参见 sorted set 。 在 Redis 2.4 版本以前, ZADD 每次只能添加一个元素。 返回值:被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。 ---------- 127.0.0.1:6379> ZRANGE people 0 -1 1) "zhangsan" 2) "wangwu" 3) "zhaoliu" 127.0.0.1:6379> ZRANGE people 0 -1 withscores 1) "zhangsan" 2) "1" 3) "wangwu" 4) "3" 5) "zhaoliu" 6) "6" <h5>ZSCORE(返回score的值)</h5> ZSCORE key member:返回有序集 key 中,成员 member 的 score 值。 如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。 返回值:member 成员的 score 值,以字符串形式表示。 ---------- 127.0.0.1:6379> ZRANGE people 0 -1 withscores 1) "zhangsan" 2) "1" 3) "wangwu" 4) "3" 5) "zhaoliu" 6) "6" 127.0.0.1:6379> ZSCORE people wangwu "3" <h5>ZINCRBY(增加score的值)</h5> 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 值,以字符串形式表示。 ---------- 127.0.0.1:6379> ZRANGE people 0 -1 withscores 1) "zhangsan" 2) "1" 3) "wangwu" 4) "3" 5) "zhaoliu" 6) "6" 127.0.0.1:6379> ZINCRBY people 1 zhangsan "2" <h5>ZCARD(返回集合数量)</h5> ZCARD key返回有序集 key 的基数。 返回值:当 key 存在且是有序集类型时,返回有序集的基数。 当 key 不存在时,返回 0 。 ---------- 127.0.0.1:6379> ZRANGE people 0 -1 1) "zhangsan" 2) "wangwu" 3) "zhaoliu" 127.0.0.1:6379> zcard people (integer) 3 <h5>ZCOUNT(返回指定元素范围内的元素数量)</h5> ZCOUNT key min max:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令。 返回值:score 值在 min 和 max 之间的成员的数量。 ---------- 127.0.0.1:6379> ZRANGE people 0 -1 withscores 1) "zhangsan" 2) "2" 3) "wangwu" 4) "3" 5) "zhaoliu" 6) "6" 127.0.0.1:6379> zcount people 0 10 (integer) 3 127.0.0.1:6379> zcount people 2 10 (integer) 3 127.0.0.1:6379> zcount people 3 10 (integer) 2 127.0.0.1:6379 <h5>ZRANGE(返回指定下标内的元素-递增)</h5> ZRANGE key start stop [WITHSCORES]返回有序集 key 中,指定区间内的成员。 其中成员的位置按 score 值递增(从小到大)来排序。 具有相同 score 值的成员按字典序(lexicographical order )来排列。 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE key start stop [WITHSCORES] 命令。 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 超出范围的下标并不会引起错误。 比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。 返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。 ---------- 127.0.0.1:6379> ZRANGE people 0 1 withscores 1) "zhangsan" 2) "2" 3) "wangwu" 4) "3" 127.0.0.1:6379> ZRANGE people 0 -1 withscores 1) "zhangsan" 2) "2" 3) "wangwu" 4) "3" 5) "zhaoliu" 6) "6" 127.0.0.1:6379> ZRANGE people 0 -1 1) "zhangsan" 2) "wangwu" 3) "zhaoliu" <h5>ZREVRANGE</h5> > ZRANGE递增排序,ZREVRANGE递减排序 <h5>ZRANGEBYSCORE(按SCORE范围返回元素-递增)</h5> 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 值一起返回。 该选项自 Redis 2.0 版本起可用 ---------- **区间及无限** min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。 默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。 举个例子: ZRANGEBYSCORE zset (1 5 返回所有符合条件 1 < score <= 5 的成员,而 ZRANGEBYSCORE zset (5 (10 则返回所有符合条件 5 < score < 10 的成员。 返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。 ---------- 127.0.0.1:6379> zadd salary 1000 zhangsan (integer) 1 127.0.0.1:6379> zadd salary 3000 lisan (integer) 1 127.0.0.1:6379> zadd salary 5000 wangsan (integer) 1 127.0.0.1:6379> zadd salary 4500 gousan (integer) 1 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 withscores 1) "zhangsan" 2) "1000" 3) "lisan" 4) "3000" 5) "gousan" 6) "4500" 7) "wangsan" 8) "5000" 127.0.0.1:6379> ZRANGEBYSCORE salary -inf (5000 withscores 1) "zhangsan" 2) "1000" 3) "lisan" 4) "3000" 5) "gousan" 6) "4500" <h5>ZRANGEBYSCOR</h5> > ZREVRANGEBYSCORE 值递减(从大到小)次序排列。 <h5>ZRANK(返回指定元素排名)</h5> ZRANK key member:返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。 排名以 0 为底,也就是说, score 值最小的成员排名为 0 。 使用 ZREVRANK key member 命令可以获得成员按 score 值递减(从大到小)排列的排名。 ---------- 127.0.0.1:6379> ZRANK salary lisan (integer) 1 <h5>ZREVRANK</h5> > 显示递减排名 <h5>ZREM(删除指定名称的元素)</h5> ZREM key member [member …]移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。 当 key 存在但不是有序集类型时,返回一个错误。 返回值:被成功移除的成员的数量,不包括被忽略的成员。 ---------- 127.0.0.1:6379> zrem salary zhangsan (integer) 1 127.0.0.1:6379> ZRANGE salary 0 -1 1) "lisan" 2) "gousan" 3) "wangsan" <h5>ZREMRANGEBYRANK(删除排名范围内的元素)</h5> ZREMRANGEBYRANK key start stop:移除有序集 key 中,指定排名(rank)区间内的所有成员。 区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 返回值:被移除成员的数量。 ---------- 127.0.0.1:6379> ZRANGE salary 0 -1 1) "lisan" 2) "gousan" 3) "wangsan" 127.0.0.1:6379> ZREMRANGEBYRANK salary 0 1 (integer) 2 127.0.0.1:6379> ZRANGE salary 0 -1 1) "wangsan" <h5>ZREMRANGEBYSCORE(删除SCORE范围内的元素)</h5> ZREMRANGEBYSCORE key min max:移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令。 ---------- redis> ZRANGE salary 0 -1 WITHSCORES # 显示有序集内所有成员及其 score 值 1) "tom" 2) "2000" 3) "peter" 4) "3500" 5) "jack" 6) "5000" redis> ZREMRANGEBYSCORE salary 1500 3500 # 移除所有薪水在 1500 到 3500 内的员工 (integer) 2 redis> ZRANGE salary 0 -1 WITHSCORES # 剩下的有序集成员 1) "jack" 2) "5000" <h5>ZREMRANGEBYSCORE(删除SCORE范围内的元素)</h5> <h5>ZUNIONSTORE(并集之后保存到集合)</h5> ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]:计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。 默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。 ---------- WEIGHTS 使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。 如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。 AGGREGATE 使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。 默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。 返回值:保存到 destination 的结果集的基数。 ---------- redis> ZRANGE programmer 0 -1 WITHSCORES 1) "peter" 2) "2000" 3) "jack" 4) "3500" 5) "tom" 6) "5000" redis> ZRANGE manager 0 -1 WITHSCORES 1) "herry" 2) "2000" 3) "mary" 4) "3500" 5) "bob" 6) "4000" redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3 # 公司决定加薪。。。除了程序员。。。 (integer) 6 redis> ZRANGE salary 0 -1 WITHSCORES 1) "peter" 2) "2000" 3) "jack" 4) "3500" 5) "tom" 6) "5000" 7) "herry" 8) "6000" 9) "mary" 10) "10500" 11) "bob" 12) "12000" ## 结尾 ## <p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;"> 腹有诗书气自华,最是书香能致远。 </p>