zset 有序集合是一种数据类型,类似于集合和Hash之间的混合。像集合一样,有序集合由唯一的、非重复的字符串元素组成,因此在某种意义上,有序集也是一个集合。
然而,虽然集合内的元素不是有序的,但已排序集合中的每个元素都与一个称为score的浮点值相关联(这就是为什么该类型也类似于散列,因为每个元素都映射到一个值)。
此外,排序集中的元素是按顺序获取的(因此它们不是按请求排序的,顺序是用于表示排序集的数据结构的一个特性)。它们是按照以下规则排列的:
1:如果A和B是两个得分不同的元素,那么A > B,则A分数> b分数。
2:如果A和B的分数完全相同,那么如果A字符串在词法上大于B字符串,则为A > B。A和B字符串不能相等,因为排序的集合只有唯一的元素。
zset 数据结构
将所有指定成员添加到键为key有序集合(sorted set)里面。 添加时可以指定多个分数/成员(score/member)对。 如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。
如果key不存在,将会创建一个新的有序集合(sorted
set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。如果key存在,但是类型不是有序集合,将会返回一个错误应答。
分数值是一个双精度的浮点型数字字符串。+inf和-inf都是有效值。
set 和 zset 的比较
集合 | 有序集合 |
---|---|
无重复元素 | 无重复元素 |
无序 | 有序 |
元素 | 元素+分数 |
List 和 zset 的比较
列表 | 有序集合 |
---|---|
有重复元素 | 无重复元素 |
有序 | 有序 |
元素 | 元素+分数 |
zset 的命令
命令 | 描述 |
---|---|
ZADD key [NX | XX] [CH] [INCR] score member [score member …] |
注:ZADD 参数(options) (>= Redis 3.0.2)
- XX: 仅仅更新存在的成员,不添加新成员。
- NX: 不更新存在的成员。只添加新成员。
- CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
- INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
相同的成员只能存在一个,分数可以重复。
127.0.0.1:6379> zadd myzset xx 50 xiaoming
(integer) 0
127.0.0.1:6379> zadd myzset 20 xiaoming
(integer) 1
127.0.0.1:6379> zadd myzset 55 xiaoming
(integer) 0
127.0.0.1:6379> zrange myzset 0 -1
1) "xiaoming"
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "xiaoming"
2) "55"
第一次添加 小明 50 ,没有添加进入,第二次增加小明 20,再次使用 xx 的参数 小明 的分数更改为了 55 .
127.0.0.1:6379> zadd myzset nx 80 xiaoming 79 xiaohua
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "xiaoming"
2) "55"
3) "xiaohua"
4) "79"
127.0.0.1:6379> zrange myzset 0 -1
1) "xiaoming"
2) "xiaohua"
添加了 2个元素,小明 80 , 小花 79 ,因为使用 nx 的参数,所以小明的不更新,只做添加操作,小花 79 插入进去了。
127.0.0.1:6379> zadd myzset ch 99 xiaowang 45 xiaogang
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "xiaogang"
2) "45"
3) "xiaoming"
4) "55"
5) "xiaohua"
6) "79"
7) "xiaowang"
8) "99"
添加了2个新的元素,ch 的参数是返回变化的总数,因此执行后,返回的是2。
127.0.0.1:6379> zadd myzset incr 5 xiaogang
"50"
使用 incr 的参数,对小钢的分数进行 +5,incr 相当于 zincrby 的命令。
127.0.0.1:6379> zadd myzset 20 xiaoyu
(integer) 1
什么参数都不加,直接进行添加。
命令 | 描述 |
---|---|
ZREM key member [member …] | 当key存在,但是其不是有序集合类型,就返回一个错误。 |
127.0.0.1:6379> zrem myzset xiaoyu
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "xiaogang"
2) "51"
3) "xiaoming"
4) "55"
5) "xiaohua"
6) "79"
7) "xiaowang"
8) "99"
命令 | 描述 |
---|---|
ZSCORE key member | 返回有序集key中,成员member的score值 |
127.0.0.1:6379> zscore myzset xiaowang
"99"
命令 | 描述 |
---|---|
ZINCRBY key increment member | 为有序集key的成员member的score值加上增量increment |
127.0.0.1:6379> zincrby myzset 10 xiaoming
"65"
命令 | 描述 |
---|---|
ZCARD key | 返回key的有序集元素个数 |
127.0.0.1:6379> zcard myzset
(integer) 4
命令 | 描述 |
---|---|
ZRANK key member | 返回有序集key中成员member的排名 |
127.0.0.1:6379> zrank myzset xiaogang
(integer) 0
127.0.0.1:6379> zrank myzset xiaohua
(integer) 2
注:从小到大的排名
命令 | 描述 |
---|---|
ZRANGE key start stop [WITHSCORES] | 返回存储在有序集合key中的指定范围的元素。 |
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "xiaogang"
2) "51"
3) "xiaoming"
4) "65"
5) "xiaohua"
6) "79"
7) "xiaowang"
8) "99"
注:参数和之前的list 命令中 lrange 的start 和 end 差不多。WITHSCORES选项,将同时返回它们的得分,不带则只返回 元素,不带分值。
命令 | 描述 |
---|---|
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 按照分数区间进行排序。 |
127.0.0.1:6379> zrangebyscore myzset 55 80 withscores
1) "xiaoming"
2) "65"
3) "xiaohua"
4) "79"
127.0.0.1:6379> zrangebyscore myzset (51 (79 withscores
1) "xiaoming"
2) "65"
注: [LIMIT offset count] 这几个参数可以用来分页。
55 80 等价于 55<= x <= 80
(51 (79 等价于 55< x < 80
命令 | 描述 |
---|---|
ZCOUNT key min max | 指定分数范围的元素个数。 |
127.0.0.1:6379> zcount myzset 60 100
(integer) 3
60 到 100 之间有3 个分值符合。
命令 | 描述 |
---|---|
ZREMRANGEBYLEX key min max | 删除名称按字典由低到高排序成员之间所有成员。 |
ZREMRANGEBYRANK key start stop | 移除有序集key中,指定排名(rank)区间内的所有成员。 |
ZREMRANGEBYSCORE key min max | 移除有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。 |
127.0.0.1:6379> zremrangebyrank myzset 0 1
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "xiaohua"
2) "79"
3) "xiaowang"
4) "99"
删除了从小到大排序中的,第一个 和第二个,如果-1 -1,删除最高的。
ZSET 集合 交集 并集
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [SUM|MIN|MAX]
计算给定的numkeys个有序集合的交集,并且把结果放到destination中。 在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)。默认情况下,结果中一个元素的分数是有序集合中该元素分数之和,前提是该元素在这些有序集合中都存在。因为交集要求其成员必须是给定的每个有序集合中的成员,结果集中的每个元素的分数和输入的有序集合个数相等。对于WEIGHTS和AGGREGATE参数的描述,参见命令ZUNIONSTORE(参见下段)。如果destination存在,就把它覆盖。
ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [SUM|MIN|MAX]
计算给定的numkeys个有序集合的并集,并且把结果放到destination中。在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)。 默认情况下,结果集中某个成员的score值是所有给定集下该成员score值之和。
使用WEIGHTS选项,你可以为每个给定的有序集指定一个乘法因子,意思就是,每个给定有序集的所有成员的score值在传递给聚合函数之前都要先乘以该因子。如果WEIGHTS没有给定,默认就是1。
使用AGGREGATE选项,你可以指定并集的结果集的聚合方式。默认使用的参数SUM,可以将所有集合中某个成员的score值之和作为结果集中该成员的score值。如果使用参数MIN或者MAX,结果集就是所有集合中元素最小或最大的元素。
如果key destination存在,就被覆盖。
zset 还有很多其他的命令,大家可以看下这个链接:
zset 命令大全
之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第一天 :为什么要使用 redis ?
Redis 坚持第二天 :Redis 的安装与启动
Redis 坚持第三天 :Redis 使用配置文件启动,常见配置学习。
Redis 坚持第四天 :