Redis五种常见的数据结构:zset
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)
1. XX: 仅仅更新存在的成员,不添加新成员。
2. NX: 不更新存在的成员。只添加新成员。
3. CH: 修改返回值为发⽣变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已
经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
4. 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"
redis支持的五种数据类型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 还有很多其他的命令,⼤家可以看下这个链接:
之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第⼀天 :
Redis 坚持第⼆天 :
Redis 坚持第三天 :
Redis 坚持第四天 :
1.
2.
3.
4.
5.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论