Redis 的有序集合保留了集合的特性(元素不能重复),而且在此基础上的元素是可以排序的(分数可以重复)。
但是,redis 的有序集合的排序和列表的排序不同,有序集合并非使用索引下标来排序,而是使用每个元素设置了一个分数(score),来做为排序的依据。
数据结构 | 是否允许元素重复 | 是否有序 | 有序实现 | 场景 |
列表 | 是 | 是 | 索引下标 | 时间轴、消息队列等 |
集合 | 否 | 否 | 无 | 标签、社交等 |
有序集合 | 否 | 是 | 分值 | 排行榜、社交等 |
zadd
key score member [score1 member1 score2 member2 ...]zcard
keyzscore
key memberzrank
key memberzrevrank
key memberzrem
key member [member1 member2 ...]zincrby
key increment memberzrange
key start end [withscores]zrevrange
key start end [withscores]zrangebyscore
key min max [withscores] [LIMIT offset count]zrevrangebyscore
key max min [withscores] zcount
key min max zremrangebyrank
key start end zremrangebyscore
key min max zinterstore
destination numbers key [key1 key2...] [WEIGHTS weight] [SUM|MIN|MAX]zunionstore
destination numbers key [key1 key2...] [WEIGHTS weight] [SUM|MIN|MAX]zadd
key [nx|xx] [CH] [INCR] score member [score1 member1 score2 member2 ...] 在有序集合中添加元素,如果元素已经存在,则会更新其score;如果该有序集合不存在,则直接创建并添加相应的元素;如果key不为sorted set 类型,则报错。
分数score 为双精度的浮点型数字字符串。
可用版本:
>= 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"
zcard
key 返回该key中的元素个数,key 不存在,返回0。
可用版本:
>= 1.2.0
时间复杂度:
O(1)
10.6.25.66:9000> zcard sortkey
(integer) 3
zscore
key member返回元素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)
zrank
key member返回有序集合中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
zrevrank
key member与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
zrem
key member [member1 member2 ...]删除有序集合中的元素,返回删除成功的个数,元素不存在的不计算,从2.4以后可以接受多个元素。
可用版本:
>= 1.2.0
时间复杂度:
O(k*log(N)),N 为元素总数,K为删除的元素个数。
10.6.25.66:9000> zrem sortkey memeber1 member2
(integer) 2
zincrby
key increment member为有序集合的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"
zrange
key start end [withscores]返回有序集合中指定排名的元素,分数由低到高,选项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"
zrevrange
key start end [withscores]返回有序集合中指定排名的元素,与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"
zrangebyscore
key min max [withscores] [LIMIT offset count]与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"
zrevrangebyscore
key max min [withscores] zrangebyscore 类似,返回有序集合中的指定元素,只不过该命令是以分数从高到低排序,选项withscores 存在,则该元素的分数会一同返回。
可用版本:
>= 1.0.5
时间复杂度:
O(log(N)+M)),N为元素总个数,M 为要返回的元素个数。
10.6.25.66:9000> zrevrangebyscore sortkey 200 0
1) "memeber1"
2) "member1"
zcount
key min max 返回有序集合中,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
zremrangebyrank
key start end 移除有序集合中指定排名(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)
zremrangebyscore
key min max 移除有序集合中指定分数(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"
zinterstore
destination numbers key [key1 key2...] [WEIGHTS weight] [SUM|MIN|MAX]计算给定的numbers 个有序集合的交集,并且把结果放在destination 中,默认得到结果分数是多个集合中的分数之和。
可用版本:
>= 2.0.0
时间复杂度:
O(N*K)+O(M*log(M)),N是元素数量最小的有序集合,M是结果元素的个数,K是有序集合的个数。
zunionstore
destination numbers key [key1 key2...] [WEIGHTS weight] [SUM|MIN|MAX]计算给定的numbers 个有序集合的并集,并且把结果放在destination 中,默认得到结果分数是多个集合中的分数之和。
可用版本:
>= 2.0.0
时间复杂度:
O(N)+O(M*log(M)) ,N是有序集合的元素个数总和,M是结果元素的个数