Redis 五种常见的数据结构:zset

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tx542009/article/details/87529916

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 插入进去了。

扫描二维码关注公众号,回复: 5751775 查看本文章
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 坚持第四天 :

  1. Redis 五种常见的数据结构:String
  2. Redis 五种常见的数据结构:Hash
  3. Redis 五种常见的数据结构:List
  4. Redis 五种常见的数据结构:Set
  5. Redis 五种常见的数据结构:zset

猜你喜欢

转载自blog.csdn.net/tx542009/article/details/87529916