发布时间:2024-03-01 22:30:01
顾名思义,Redis zset(有序集合)中的成员是有序排列的,它和 set 集合的相同之处在于,集合中的每一个成员都是字符串类型,并且不允许重复;而它们最大区别是,有序集合是有序的,set 是无序的,这是因为有序集合中每个成员都会关联一个 double(双精度浮点数)类型的 score (分数值),Redis 正是通过 score 实现了对集合成员的排序。127.0.0.1:6379> ZADD key score member [score member ...]key:指定一个键名;
注意:在有序集合中,成员是唯一存在的,但是分数(score)却可以重复。有序集合的最大的成员数为 2^32 - 1 (大约 40 多亿个)。
2^16 - 2
大时,需要完全遍历 entry 列表来获取 entry 的总数目。ZADD
命令添加两个成员:xh(小红) 的工资是 3500.0;xm(小明) 的工资是 3200.0。ZADD salary 3500.0 xh 3200.0 xm上述成员在压缩列表中的布局,如下所示:
typedf struct zskiplist{ //头节点 struct zskiplistNode *header; //尾节点 struct zskiplistNode *tail; // 跳表中的元素个数 unsigned long length; //表内节点的最大层数 int level; }zskiplist;
S:V
节点,然后从此节点开始,逐层下降,通过遍历的方式找出每一层的 S:V 节点,直至降至最底层(L0)才停止。在这个过程中找到所有 S:V 节点被称为期望的节点。跳跃列表把上述搜索一系列期望节点的过程称为“搜索路径”,这个“搜索路径”由搜索到的每一层的期望节点组成,其本质是一个列表。命令 | 说明 |
---|---|
ZADD key score1 member1 [score2 member2] | 用于将一个或多个成员添加到有序集合中,或者更新已存在成员的 score 值 |
ZCARD key | 获取有序集合中成员的数量 |
ZCOUNT key min max | 用于统计有序集合中指定 score 值范围内的元素个数。 |
ZINCRBY key increment member | 用于增加有序集合中成员的分值。 |
ZINTERSTORE destination numkeys key [key ...] | 求两个或者多个有序集合的交集,并将所得结果存储在新的 key 中。 |
ZLEXCOUNT key min max | 当成员分数相同时,计算有序集合中在指定词典范围内的成员的数量。 |
ZRANGE key start stop [WITHSCORES] | 返回有序集合中指定索引区间内的成员数量。 |
ZRANGEBYLEX key min max [LIMIT offset count] | 返回有序集中指定字典区间内的成员数量。 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 返回有序集合中指定分数区间内的成员。 |
ZRANK key member | 返回有序集合中指定成员的排名。 |
ZREM key member [member ...] | 移除有序集合中的一个或多个成员。 |
ZREMRANGEBYLEX key min max | 移除有序集合中指定字典区间的所有成员。 |
ZREMRANGEBYRANK key start stop | 移除有序集合中指定排名区间内的所有成员。 |
ZREMRANGEBYSCORE key min max | 移除有序集合中指定分数区间内的所有成员。 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低。 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分数区间内的成员,分数从高到低排序。 |
ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序。 |
ZSCORE key member | 返回有序集中,指定成员的分数值。 |
ZUNIONSTORE destination numkeys key [key ...] | 求两个或多个有序集合的并集,并将返回结果存储在新的 key 中。 |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成员和元素分值)。 |
#在有序集合中添加一个成员 127.0.0.1:6379> ZADD salary 4000 lucy (integer) 1 #同时添加多个成员 127.0.0.1:6379> ZADD salary 5000 tom 6000 Helen 6500.50 Jack 3000 Smith (integer) 4 #查询指定区间上的元素 127.0.0.1:6379> ZRANGE salary 0 4 1) "Smith" 2) "lucy" 3) "tom" 4) "Helen" 5) "Jack" #降序查看指定区间上的元素 127.0.0.1:6379> ZREVRANGE salary 0 4 1) "Jack" 2) "Helen" 3) "tom" 4) "lucy" 5) "Smith" #查看指定元素的分值 127.0.0.1:6379> ZSCORE salary lucy "4000" #查看所有元素和分值 127.0.0.1:6379> ZRANGE salary 0 4 WITHSCORES 1) "Smith" 2) "3000" 3) "lucy" 4) "4000" 5) "tom" 6) "5000" 7) "Helen" 8) "6000" 9) "Jack" 10) "6500.5" #统计指定工资范围内的元素个数3000 ZCOUNT salary 3000 5000 (integer) 3 #表示3000在线练习工具:https://try.redis.io/ZCOUNT salary (3000 (5000 (integer) 1 #返回指定工资范围内的score和成员,限制条件是跳过1个元素,返回2个元素。 127.0.0.1:6379> ZRANGEBYSCORE salary 3000 6000 WITHSCORES LIMIT 1 2 1) "lucy" 2) "4000" 3) "tom" 4) "5000" #查看有序集合在指定字典区间内的成员的数 #其中 - 表示最小值,而 + 则表示最大值 127.0.0.1:6379> ZLEXCOUNT salary - + (integer) 5