Redis常用操作--------SortedSet(有序集合)

1.ZADD key score member [[score member] [score member] ...]

将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。

score 值可以是整数值或双精度浮点数。

如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。

当 key 存在但不是有序集类型时,返回一个错误。

在 Redis 2.4 版本以前, ZADD 每次只能添加一个元素。

可用版本:
>= 1.2.0
时间复杂度:
O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量。
返回值:
被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
# 添加单个元素

redis> ZADD page_rank 10 google.com
(integer) 1

# 添加多个元素

redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

# 添加已存在元素,且 score 值不变

redis> ZADD page_rank 10 google.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # 没有改变
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

# 添加已存在元素,但是改变 score 值

redis> ZADD page_rank 6 bing.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # bing.com 元素的 score 值被改变
1) "bing.com"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

2.ZCARD key

返回有序集 key 的基数。

可用版本:
>= 1.2.0
时间复杂度:
O(1)
返回值:

当 key 存在且是有序集类型时,返回有序集的基数。

当 key 不存在时,返回 0 。

3.ZCOUNT key min max

返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。

关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。

可用版本:
>= 2.0.0
时间复杂度:
O(log(N)+M), N 为有序集的基数, M 为值在 min 和 max 之间的元素的数量。
返回值:
score 值在 min 和 max 之间的成员的数量。

4.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 值可以是整数值或双精度浮点数。

可用版本:
>= 1.2.0
时间复杂度:
O(log(N))
返回值:
member 成员的新 score 值,以字符串形式表示。

5.ZRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定区间内的成员。

其中成员的位置按 score 值递增(从小到大)来排序。

具有相同 score 值的成员按字典序(lexicographical order )来排列。

如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。

下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

超出范围的下标并不会引起错误。

比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。

另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。

可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。

客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。

可用版本:
>= 1.2.0
时间复杂度:
O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。
返回值:
指定区间内,带有 score 值(可选)的有序集成员的列表。
redis > ZRANGE salary 0 -1 WITHSCORES             # 显示整个有序集成员
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 1 2 WITHSCORES              # 显示有序集下标区间 1 至 2 的成员
1) "tom"
2) "5000"
3) "boss"
4) "10086"

redis > ZRANGE salary 0 200000 WITHSCORES         # 测试 end 下标超出最大下标时的情况
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 200000 3000000 WITHSCORES   # 测试当给定区间不存在于有序集时的情况
(empty list or set)

6.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 的成员。

可用版本:
>= 1.0.5
时间复杂度:
O(log(N)+M), N 为有序集的基数, M 为被结果集的基数。
返回值:
指定区间内,带有 score 值(可选)的有序集成员的列表。

redis> ZADD salary 2500 jack                        # 测试数据
(integer) 0
redis> ZADD salary 5000 tom
(integer) 0
redis> ZADD salary 12000 peter
(integer) 0

redis> ZRANGEBYSCORE salary -inf +inf               # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"

redis> ZRANGEBYSCORE salary -inf +inf WITHSCORES    # 显示整个有序集及成员的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"

redis> ZRANGEBYSCORE salary -inf 5000 WITHSCORES    # 显示工资 <=5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"

redis> ZRANGEBYSCORE salary (5000 400000            # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"

7.ZRANK key member

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。

排名以 0 为底,也就是说, score 值最小的成员排名为 0 。

使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。

可用版本:
>= 2.0.0
时间复杂度:
O(log(N))
返回值:

如果 member 是有序集 key 的成员,返回 member 的排名。

如果 member 不是有序集 key 的成员,返回 nil 。

redis> ZRANGE salary 0 -1 WITHSCORES        # 显示所有成员及其 score 值
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

redis> ZRANK salary tom                     # 显示 tom 的薪水排名,第二
(integer) 1

8.ZREM key member [member ...]

移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

当 key 存在但不是有序集类型时,返回一个错误。

在 Redis 2.4 版本以前, ZREM 每次只能删除一个元素。

可用版本:
>= 1.2.0
时间复杂度:
O(M*log(N)), N 为有序集的基数, M 为被成功移除的成员的数量。
返回值:
被成功移除的成员的数量,不包括被忽略的成员。

9.ZREMRANGEBYRANK key start stop

移除有序集 key 中,指定排名(rank)区间内的所有成员。

区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。

下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

可用版本:
>= 2.0.0
时间复杂度:
O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。
返回值:
被移除成员的数量。

redis> ZADD salary 2000 jack
(integer) 1
redis> ZADD salary 5000 tom
(integer) 1
redis> ZADD salary 3500 peter
(integer) 1

redis> ZREMRANGEBYRANK salary 0 1       # 移除下标 0 至 1 区间内的成员
(integer) 2

redis> ZRANGE salary 0 -1 WITHSCORES    # 有序集只剩下一个成员
1) "tom"
2) "5000"

10.ZREMRANGEBYSCORE key min max

移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。

自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE 命令。

可用版本:
>= 1.2.0
时间复杂度:
O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。
返回值:
被移除成员的数量。

ZREVRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定区间内的成员。

其中成员的位置按 score 值递减(从大到小)来排列。

具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。

除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。

可用版本:
>= 1.2.0
时间复杂度:
O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。
返回值:
指定区间内,带有 score 值(可选)的有序集成员的列表。

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。

具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。

除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。

可用版本:
>= 2.2.0
时间复杂度:
O(log(N)+M), N 为有序集的基数, M 为结果集的基数。
返回值:
指定区间内,带有 score 值(可选)的有序集成员的列表。

11.ZREVRANK key member

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。

排名以 0 为底,也就是说, score 值最大的成员排名为 0 。

使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。

可用版本:
>= 2.0.0
时间复杂度:
O(log(N))
返回值:

如果 member 是有序集 key 的成员,返回 member 的排名。

如果 member 不是有序集 key 的成员,返回 nil 。

12.ZSCORE key member

返回有序集 key 中,成员 member 的 score 值。

如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

可用版本:
>= 1.2.0
时间复杂度:
O(1)
返回值:
member 成员的 score 值,以字符串形式表示。

13.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 值。

可用版本:
>= 2.0.0
时间复杂度:
O(N)+O(M log(M)), N 为给定有序集基数的总和, M 为结果集的基数。
返回值:
保存到 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"

14.ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。

默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.

关于 WEIGHTS 和 AGGREGATE 选项的描述,参见 ZUNIONSTORE 命令。

可用版本:
>= 2.0.0
时间复杂度:
O(N*K)+O(M*log(M)), N 为给定 key 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数。
返回值:
保存到 destination 的结果集的基数。

redis > ZADD mid_test 70 "Li Lei"
(integer) 1
redis > ZADD mid_test 70 "Han Meimei"
(integer) 1
redis > ZADD mid_test 99.5 "Tom"
(integer) 1

redis > ZADD fin_test 88 "Li Lei"
(integer) 1
redis > ZADD fin_test 75 "Han Meimei"
(integer) 1
redis > ZADD fin_test 99.5 "Tom"
(integer) 1

redis > ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3

redis > ZRANGE sum_point 0 -1 WITHSCORES     # 显示有序集内所有成员及其 score 值
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"

原文地址:https://www.cnblogs.com/cangqinglang/p/10201434.html

时间: 2024-12-20 17:59:18

Redis常用操作--------SortedSet(有序集合)的相关文章

lunix下的redis数据库操作——zset有序集合

创建:(有序集合存在一个权重的概念) zadd zset 1 a 2 b 3 c 4 d 5 e 6 f 7 g # 输出: # 1) "a" # 2) "b" # 3) "c" # 4) "d" # 5) "e" # 6) "f" # 7) "g" # 左边权重,右边元素 查看: zrange zset 0 -1 # 索引值,第一个和最后一个 倒序查看: zrevr

Redis常用操作-------Set(集合)

1.SADD key member [member ...] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略. 假如 key 不存在,则创建一个只包含 member 元素作成员的集合. 当 key 不是集合类型时,返回一个错误. 在Redis2.4版本以前, SADD 只接受单个 member 值. 可用版本: >= 1.0.0 时间复杂度: O(N), N 是被添加的元素的数量. 返回值: 被添加到集合中的新元素的数量,不包括被忽略的元素

5种redis常用操作(数据类型+键值+服务+安全)

[toc] 5种redis常用数据类型操作 一.Redis常用操作 (string, list) 1.1 如果一个key设置两个不同的值,第二个值会覆盖第一个值. [[email protected] ~]# cd /usr/local/src/redis-4.0.9 [[email protected] redis-4.0.9]# redis-cli 127.0.0.1:6379> set key1 xavi OK 127.0.0.1:6379> set key2 xavilinux OK

redis常用操作、 redis操作键值、 redis安全设置

一:redis常用操作 Redis常用操作?(string, list)set key1 aminglinuxget key1set key1 aming//第二次赋值会覆盖setnx key2 aaa //返回1 如果key2不存在直接创建keysetnx key2 bbb //返回0,如果key2存在,返回0setex key3 10 1 //给key3设置过期时间为10s,值为1,若key已经存在,会覆盖新的值mset k1 1 k2 a k3 cmget k1 k3 k2lpush li

redis常用操作和操作键值

string.list常用操作 string数据创建.覆盖及设置过期时间 127.0.0.1:6379> get key1 ? ? ? ? 查看原来的key1的值 "b" 127.0.0.1:6379> set key1 123 ? ? 覆盖创建一个新的key1的string的值 OK 127.0.0.1:6379> get key1 ? ? ? ? 查看 "123" 127.0.0.1:6379> setnx key1 456 ? ? 使用

Spring Boot 和 Redis 常用操作

1    第4-2课:Spring Boot 和 Redis 常用操作 Redis 是目前使用最广泛的缓存中间件,相比 Memcached,Redis 支持更多的数据结构和更丰富的数据操作,另外 Redis 有着丰富的集群方案和使用场景,这一课我们一起学习 Redis 的常用操作. 1.1    Redis 介绍 Redis 是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与 5 种不同类型的值(Value)之间的映射(Mapping),可

15天玩转redis —— 第六篇 有序集合类型

今天我们说一下Redis中最后一个数据类型 “有序集合类型”,回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这 些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个世界上都已经存在着,曾几何时,我们想把所有数据按照数据结构模式组成 后灌输到内存中,然而为了达到内存共享的方式,不得不将这块内存包装成wcf单独部署,同时还要考虑怎么序列化,何时序列互的问题,烦心事太多 太多...后来才知道有redis这么个吊毛玩意,能把高级的,低级的数据结构单独包装到一个共享内存

Redis常用操作

一.string类型的常用命令 set key1 com #一个key对应一个value,多次复制,会覆盖前面的value setnx key1 zhangsan #如果key1不存在则创建key1,并返回1,如果可以key1存在,则不会覆盖key1的值,并返回0 setex key3 100 fansik #创建key3设置过期时间为100秒 ttl key3 #查看key还有多久过期 mset key4 123 key5 213 #同时设置多个值 mget key1 key2 key4 ke

Redis数据操作之无序集合 | Redis

| Redis 的集合以无序的方式储存多个各不相同的元素 # 用户可以快速地向集合添加元素,或者从集合里面删除元素,也可以对多个集合 进行集合运算操作,比如计算并集,交集和差集. | 元素操作 -- 添加元素     sadd key element [element ...]     # 将一个或多个元素添加到给定的集合里面,已经存在于集合的元素会         自动被忽略,命令返回新添加到集合的元素数量. -- 移除元素     srem key element [element ...]