Redis 的有序集合保留了集合的特性(元素不能重复),而且在此基础上的元素是可以排序的(分数可以重复)。

但是,redis 的有序集合的排序和列表的排序不同,有序集合并非使用索引下标来排序,而是使用每个元素设置了一个分数(score),来做为排序的依据。

数据结构 是否允许元素重复 是否有序 有序实现 场景
列表 索引下标 时间轴、消息队列等
集合 标签、社交等
有序集合 分值 排行榜、社交等

在有序集合中添加元素,如果元素已经存在,则会更新其score;如果该有序集合不存在,则直接创建并添加相应的元素;如果key不为sorted set 类型,则报错。

分数score 为双精度的浮点型数字字符串。

  • XX:仅更新存在的成员,不添加新成员;
  • NX:不更新存在的成员。只添加新成员;
  • CH:修改返回值为发生变化的成员总数;也就是不管元素存在不存在,只要分数变了就+1,分数不变不计算;
  • INCR:不指定这个选项的时候,命令等于zincrby命令,对成员的分数进行递增操作;

可用版本:>= 1.2.0
时间复杂度:O(k*log(N)) k 为添加成员的个数,n是当前有序集合成员个数;


10.6.25.66:9000> zadd sortkey 10 member1
(integer) 1
10.6.25.66:9000> zadd sortkey 20 member1
(integer) 0
10.6.25.66:9000> zadd sortkey 20 member2
(integer) 1
10.6.25.66:9000> zadd sortkey NX 20 member2  10 memeber1
(integer) 1
10.6.25.66:9000> zrange sortkey 0 30 withscores
1) "memeber1"
2) "10"
3) "member1"
4) "20"
5) "member2"
6) "20"
                

返回该key中的元素个数,key 不存在,返回0。

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


10.6.25.66:9000> zcard sortkey
(integer) 3
                

返回元素member 的分数大小,如果member 不存在,则返回 nil。

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


10.6.25.66:9000> zscore sortkey memeber1
"10"
10.6.25.66:9000> zscore sortkey memeber2
(nil)
                

返回有序集合中member 的排名,其中排序顺序为score递增,score值最小的成员排名为0。

可用版本:>= 2.0.0
时间复杂度:O(log(N)),N 为元素的个数。


10.6.25.66:9000> zrank sortkey memeber1
(integer) 0
10.6.25.66:9000> zrank sortkey member2
(integer) 2
                

与zrank 类似,返回有序集合中member 的排名,不过是以score 递减返回,score值最大的成员排名为0。

可用版本:>= 2.0.0
时间复杂度:O(N),N 为元素 个数


10.6.25.66:9000> zrevrank sortkey member2
(integer) 0
10.6.25.66:9000> zrevrank sortkey memeber1
(integer) 2
                

删除有序集合中的元素,返回删除成功的个数,元素不存在的不计算,从2.4以后可以接受多个元素。

可用版本:>= 1.2.0
时间复杂度:O(k*log(N)),N 为元素总数,K为删除的元素个数。


10.6.25.66:9000> zrem sortkey memeber1 member2
(integer) 2
                

为有序集合的member的score 增加上增量increment ,如果member不存在,则新增,score 即为increment;返回值为更新后member 的score

可用版本:>= 1.2.0
时间复杂度:O(log(N)),N 为元素个数。


10.6.25.66:9000> zincrby sortkey 10.5 memeber1
"10.5"
10.6.25.66:9000> zincrby sortkey 101.5 memeber1
"112"
                

返回有序集合中指定排名的元素,分数由低到高,选项withscores 存在,则该元素的分数会一同返回,start 为0代表第一个元素,end 为1代表下一个元素,如果end 为-1则代表最后一个元素。

可用版本:>1.2.0
时间复杂度:O(log(N)+M),N为元素总个数,M 为start和end 之间的取出个数。


10.6.25.66:9000> zrange sortkey 0 -1
1) "member1"
2) "memeber1"
10.6.25.66:9000>
10.6.25.66:9000> zrange sortkey 0 -1 withscores
1) "member1"
2) "20"
3) "memeber1"
4) "112"
                

返回有序集合中指定排名的元素,与zrange 相反,分数由高到低,选项withscores 存在,则该元素的分数会一同返回,start 为0代表第一个元素,end 为1代表下一个元素,如果end 为-1则代表最后一个元素。

可用版本:>1.2.0
时间复杂度:O(log(N)+M),N为元素总个数,M 为start和end 之间的取出个数。


10.6.25.66:9000> zrevrange sortkey 0 -1
1) "memeber1"
2) "member1"
10.6.25.66:9000> zrevrange sortkey 0 -1 withscores
1) "memeber1"
2) "112"
3) "member1"
4) "20"
                

与zrange 类似,返回有序集合中的指定元素,只不过该命令是指定分数区间,zrange 是指定排序位置区间,选项withscores 存在,则该元素的分数会一同返回。

min:最小分数;max:最大分数;limit:指定返回的数量及区间(类似mysql limit),min 和max 可以使用开(闭)区间表示,如:ZRANGEBYSCORE sortkey (1 5。

可用版本:>= 1.0.5
时间复杂度:O(log(N)+M)),N为元素总个数,M 为要返回的元素个数。


10.6.25.66:9000> zrangebyscore sortkey 0 100 withscores
1) "member1"
2) "20"
10.6.25.66:9000> zrangebyscore sortkey 0 200 withscores
1) "member1"
2) "20"
3) "memeber1"
4) "112"
10.6.25.66:9000> zrangebyscore sortkey 0 200) withscores
(error) ERR min or max is not a float
10.6.25.66:9000> zrangebyscore sortkey 0 (200 withscores
1) "member1"
2) "20"
3) "memeber1"
4) "112"
                

zrangebyscore 类似,返回有序集合中的指定元素,只不过该命令是以分数从高到低排序,选项withscores 存在,则该元素的分数会一同返回。

可用版本:>= 1.0.5
时间复杂度:O(log(N)+M)),N为元素总个数,M 为要返回的元素个数。


10.6.25.66:9000> zrevrangebyscore sortkey 200 0
1) "memeber1"
2) "member1"
                

返回有序集合中,score 值在min 与max 中间的成员(可以等于)

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


10.6.25.66:9000> zcount sortkey 0 100
(integer) 1
10.6.25.66:9000> zcount sortkey 0 200
(integer) 2
                

移除有序集合中指定排名(rank)内的元素

可用版本:>= 2.0.0
时间复杂度:O(log(N)+M),M是要删除的元素个数,N 是所有的元素总数。


10.6.25.66:9000> zremrangebyrank sortkey 0 1
(integer) 2
10.6.25.66:9000> zrange sortkey 0 -1
(empty list or set)
                

移除有序集合中指定分数(score)内的元素

可用版本:>= 1.2.0
时间复杂度:O(log(N)+M),M是要删除的元素个数,N 是所有的元素总数。


10.6.25.66:9000> zadd sortkey 10 member1 20 member2 30 memeber3
(integer) 3
10.6.25.66:9000> zremrangebyscore sortkey 15 30
(integer) 2
10.6.25.66:9000> zrange sortkey 0 -1
1) "member1"
                

计算给定的numbers 个有序集合的交集,并且把结果放在destination 中,默认得到结果分数是多个集合中的分数之和。

可用版本:>= 2.0.0
时间复杂度:O(N*K)+O(M*log(M)),N是元素数量最小的有序集合,M是结果元素的个数,K是有序集合的个数。

计算给定的numbers 个有序集合的并集,并且把结果放在destination 中,默认得到结果分数是多个集合中的分数之和。

可用版本:>= 2.0.0
时间复杂度:O(N)+O(M*log(M)) ,N是有序集合的元素个数总和,M是结果元素的个数

Copyright © 2019-2020 2024-04-24 01:31:25