redis(2)-api-zset

有序集合相对于哈希、 列表、 集合来说会有一点点陌生, 但既然叫有序集合, 那么它和集合必然有着联系, 它保留了集合不能有重复成员的特性,但不同的是, 有序集合中的元素可以排序。 但是它和列表使用索引下标作为排序依据不同的是, 它给每个元素设置一个分数(score) 作为排序的依据。 如图所示, 该有序集合包含kris、 mike、 frank、 tim、 martin、 tom,它们的分数分别是1、 91、 200、 220、 250、 251, 有序集合提供了获取指定分数和元素范围查询、 计算成员排名等功能, 合理的利用有序集合, 能帮助我们在实际开发中解决很多问题。
在这里插入图片描述
有序集合中的元素不能重复, 但是score可以重复, 就和一个班里的同学学号不能重复, 但是考试成绩可以相同。比如在排行榜这个场景中使用有序集合。

1.集合内
添加成员
zadd key score member [score member …]
返回结果代表成功添加成员的个数

有关zadd命令有两点需要注意:
·Redis3.2为zadd命令添加了nx、 xx、 ch、 incr四个选项:
·nx: member必须不存在, 才可以设置成功, 用于添加。
·xx: member必须存在, 才可以设置成功, 用于更新。
·ch: 返回此次操作后, 有序集合元素和分数发生变化的个数
·incr: 对score做增加, 相当于后面介绍的zincrby。
有序集合相比集合提供了排序字段, 但是也产生了代价, zadd的时间复杂度为O(log(n) ) , sadd的时间复杂度为O(1)

(2) 计算成员个数
zcard key
和集合类型的scard命令一样, zcard的时间复杂度为O(1)。

(3) 计算某个成员的分数
zscore key member
如果成员不存在则返回nil

(4) 计算成员的排名
zrank key member
zrevrank key member
zrank是从分数从低到高返回排名, zrevrank反之

(5) 删除成员
zrem key member [member …]
返回结果为成功删除的个数。

(6) 增加成员的分数
zincrby key increment member

(7) 返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]

有序集合是按照分值排名的, zrange是从低到高返回, zrevrange反之。下面代码返回排名最低的是三个成员, 如果加上withscores选项, 同时会返回成员的分数。

(8) 返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]

其中zrangebyscore按照分数从低到高返回, zrevrangebyscore反之。withscores选项会同时返回每个成员的分数。 [limit offset count]选项可以限制输出的起始位置和个数。
同时min和max还支持开区间(小括号) 和闭区间(中括号) , -inf和+inf分别代表无限小和无限大。

(9) 返回指定分数范围成员个数
zcount key min max

(10) 删除指定排名内的升序元素
zremrangebyrank key start end
下面操作删除第start到第end名的成员

(11) 删除指定分数范围的成员
zremrangebyscore key min max

2.集合间的操作

(1) 交集
zinterstore destination numkeys key [key …] [weights weight [weight …]][aggregate sum|min|max]

这个命令参数较多, 下面分别进行说明:
·destination: 交集计算结果保存到这个键。
·numkeys: 需要做交集计算键的个数。
·key[key…]: 需要做交集计算的键。
·weights weight[weight…]: 每个键的权重, 在做交集计算时, 每个键中的每个member会将自己分数乘以这个权重, 每个键的权重默认是1。
·aggregate sum|min|max: 计算成员交集后, 分值可以按照sum(和) 、min(最小值) 、 max(最大值) 做汇总, 默认值是sum

(2) 并集
zunionstore destination numkeys key [key …] [weights weight [weight …]][aggregate sum|min|max]
该命令的所有参数和zinterstore是一致的, 只不过是做并集计算。

内部编码

有序集合类型的内部编码有两种:

·ziplist(压缩列表) : 当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个) , 同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节) 时, Redis会用ziplist来作为有序集合的内部实现, ziplist可以有效减少内存的使用。

·skiplist(跳跃表) : 当ziplist条件不满足时, 有序集合会使用skiplist作为内部实现, 因为此时ziplist的读写效率会下降。

<think>好的,用户想了解RedisZSet相关的API及使用方法。首先,我需要回忆一下ZSet的基本概念和常用命令。ZSet是有序集合,每个成员都有一个分数,根据分数排序。常用命令包括ZADD、ZRANGE、ZRANK、ZSCORE、ZREM等。 接下来,我需要检查用户提供的引用内容,看看是否有相关信息。引用[2]提到了Redis Client的版本和jedis的使用,可能涉及API调用。引用[4]提到了保存JavaBean到hash表,可能与数据结构有关,但ZSet是单独的类型,需要区分。 用户可能需要具体的命令示例和Jedis中的用法。比如ZADD添加成员,ZRANGE按范围获取,ZRANK获取排名。要注意分数排序是升序还是降序,以及范围查询的参数。 另外,用户可能需要知道应用场景,比如排行榜、优先级队列。需要结合实际例子说明,比如用ZSET实现文章热度排名。 需要确保回答结构清晰,分点说明每个命令的用途、语法、示例,再给出Java代码示例。最后生成相关问题,比如应用场景、性能优化、分数更新等。 还需要注意引用标记,比如在提到添加成员时引用相关的文档。确保所有命令使用$...$格式,独立公式用$$...$$,但ZSet命令可能不需要数学公式,主要用代码块。</think>### RedisZSet(有序集合)API及使用方法 #### 1. ZSet核心特性 ZSet(Sorted Set)是Redis中一种有序数据结构,其特点为: - 每个元素关联一个`分数(score)`,用于排序 - 元素唯一,但分数可重复 - 支持基于分数范围的操作和排名查询 #### 2. 常用API及示例 以下为ZSet常用命令(使用`$...$`格式标注命令): 1. **添加元素** ```bash $ZADD key [NX|XX] [CH] [INCR] score member [score member ...]$ ``` - 示例:向`article:hot`添加三篇文章的热度值 ```bash 127.0.0.1:6379> ZADD article:hot 1520 "post_101" 980 "post_102" 2540 "post_103" ``` [^2] 2. **范围查询** ```bash $ZRANGE key start stop [WITHSCORES]$ $ZREVRANGE key start stop [WITHSCORES]$ ``` - 示例:获取热度前三的文章(降序) ```bash 127.0.0.1:6379> ZREVRANGE article:hot 0 2 WITHSCORES ``` 3. **分数操作** ```bash $ZINCRBY key increment member$ # 分数增减 $ZSCORE key member$ # 获取分数 ``` - 示例:给文章`post_101`增加50热度 ```bash 127.0.0.1:6379> ZINCRBY article:hot 50 "post_101" ``` 4. **排名查询** ```bash $ZRANK key member$ # 升序排名 $ZREVRANK key member$ # 降序排名 ``` - 示例:查询`post_103`的排名 ```bash 127.0.0.1:6379> ZREVRANK article:hot "post_103" ``` #### 3. Java客户端示例(Jedis) ```java // 添加元素 jedis.zadd("article:hot", 1520, "post_101"); jedis.zadd("article:hot", 980, "post_102"); // 获取TOP3 Set<Tuple> topArticles = jedis.zrevrangeWithScores("article:hot", 0, 2); for (Tuple tuple : topArticles) { System.out.println(tuple.getElement() + ": " + tuple.getScore()); } // 更新分数 jedis.zincrby("article:hot", 100, "post_102"); // 增加100热度[^2] ``` #### 4. 典型应用场景 1. **实时排行榜**:游戏积分榜、电商热销榜 2. **延迟队列**:使用时间戳作为score实现定时任务 3. **范围统计**:统计指定分数段的用户数量 4. **优先级调度**:使用score表示任务优先级
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值