Redis zSet命令

本文介绍了Redis中有序集合的各种操作方法,包括添加元素、获取范围内的元素、删除元素、计算元素数量等。此外还详细讲解了如何对多个有序集合进行并集和交集运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

zAdd

增加一个或多个元素,如果该元素已经存在,更新它的socre值
虽然有序集合有序,但它也是集合,不能重复元素,添加重复元素只会
更新原有元素的score值

$redis->zAdd('key', 1, 'val1');
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 5, 'val5');
$redis->zRange('key', 0, -1); // array(val0, val1, val5)


zRange

取得特定范围内的排序元素,0代表第一个元素,1代表第二个以此类推。-1代表最后一个,-2代表倒数第二个...

$redis->zAdd('key1', 0, 'val0');
$redis->zAdd('key1', 2, 'val2');
$redis->zAdd('key1', 10, 'val10');
$redis->zRange('key1', 0, -1); /* array('val0', 'val2', 'val10') */

// with scores
$redis->zRange('key1', 0, -1, true); /* array('val0' => 0, 'val2' => 2, 'val10' => 10) */


zDelete

从有序集合中删除指定的成员

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zDelete('key', 'val2');
$redis->zRange('key', 0, -1); /* array('val0', 'val10') */


zRevRange

返回key对应的有序集合中指定区间的所有元素。这些元素按照score从高到低的顺序进行排列。对于具有相同的score的元素而言,将会按照递减的字典顺序进行排列。该命令与ZRANGE类似,只是该命令中元素的排列顺序与前者不同。

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRevRange('key', 0, -1); /* array('val10', 'val2', 'val0') */

// with scores
$redis->zRevRange('key', 0, -1, true); /* array('val10' => 10, 'val2' => 2, 'val0' => 0) */

zRangeByScore

返回key对应的有序集合中score介于min和max之间的所有元素(包哈score等于min或者max的元素)。元素按照score从低到高的顺序排列。如果元素具有相同的score,那么会按照字典顺序排列。
可选的选项LIMIT可以用来获取一定范围内的匹配元素。如果偏移值较大,有序集合需要在获得将要返回的元素之前进行遍历,因此会增加O(N)的时间复杂度。可选的选项WITHSCORES可以使得在返回元素的同时返回元素的score,该选项自从Redis 2.0版本后可用。

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRangeByScore('key', 0, 3); /* array('val0', 'val2') */
$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE); /* array('val0' => 0, 'val2' => 2) */
$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); /* array('val2' => 2) */
$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); /* array('val2') */
$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE, 'limit' => array(1, 1)); /* array('val2' => 2) */


zCount

返回key对应的有序集合中介于min和max间的元素的个数。

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zCount('key', 0, 3); /* 2, corresponding to array('val0', 'val2') */

zSize,zCard

返回存储在key对应的有序集合中的元素的个数。

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zSize('key'); /* 3 */


zRemRangeByScore, zDeleteRangeByScore

移除key对应的有序集合中scroe位于min和max(包含端点)之间的所哟元素。从2.1.6版本后开始,区间端点min和max可以被排除在外,这和ZRANGEBYSCORE的语法一样。

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRemRangeByScore('key', 0, 3); /* 2 */


zRemRangeByRank, zDeleteRangeByRank

移除key对应的有序集合中rank值介于start和stop之间的所有元素。start和stop均是从0开始的,并且两者均可以是负值。当索引值为负值时,表明偏移值从有序集合中score值最高的元素开始。例如:-1表示具有最高score的元素,而-2表示具有次高score的元素,以此类推。

$redis->zAdd('key', 1, 'one');
$redis->zAdd('key', 2, 'two');
$redis->zAdd('key', 3, 'three');
$redis->zRemRangeByRank('key', 0, 1); /* 2 */
$redis->zRange('key', 0, -1, array('withscores' => TRUE)); /* array('three' => 3) */


zScore

返回key对应的有序集合中member的score值。如果member在有序集合中不存在,那么将会返回nil。

$redis->zAdd('key', 2.5, 'val2');
$redis->zScore('key', 'val2'); /* 2.5 */


zRank, zRevRank

返回key对应的有序集合中member元素的索引值,元素按照score从低到高进行排列。rank值(或index)是从0开始的,这意味着具有最低score值的元素的rank值为0。使用ZREVRANK可以获得从高到低排列的元素的rank(或index)。

$redis->delete('z');
$redis->zAdd('key', 1, 'one');
$redis->zAdd('key', 2, 'two');
$redis->zRank('key', 'one'); /* 0 */
$redis->zRank('key', 'two'); /* 1 */
$redis->zRevRank('key', 'one'); /* 1 */
$redis->zRevRank('key', 'two'); /* 0 */


zIncBy

将key对应的有序集合中member元素的scroe加上increment。如果指定的member不存在,那么将会添加该元素,并且其score的初始值为increment。如果key不存在,那么将会创建一个新的有序列表,其中包含member这一唯一的元素。如果key对应的值不是有序列表,那么将会发生错误。指定的score的值应该是能够转换为数字值的字符串,并且接收双精度浮点数。同时,你也可用提供一个负值,这样将减少score的值。

$redis->delete('key');
$redis->zIncrBy('key', 2.5, 'member1'); /* key or member1 didn't exist, so member1's score is to 0 before the increment */
                      /* and now has the value 2.5  */
$redis->zIncrBy('key', 1, 'member1'); /* 3.5 */


zUnion

对keys对应的numkeys个有序集合计算合集,并将结果存储在destination中。在传递输入keys之前必须提供输入keys的个数和其它可选参数。在默认情况下,元素的结果score是包含该元素的所有有序集合中score的和。如果使用WEIGHTS选项,你可以对每一个有序集合指定一个操作因子。这意味着每一个有序集合中的每个元素的score在传递给聚合函数之前均会被乘以该因子。当WEIGHTS没有指定时,操作因子默认为1。
使用AGGREGATE选项,你可以指定交集中的结果如何被聚合。该选项默认值为SUM,在这种情况下,一个元素的所有score值均会被相加。当选项被设置为MIN或MAX时,结果集合中将会包含一个元素的最大或者最小的score值。如果destination已经存在,那么它将会被重写。

$redis->delete('k1');
$redis->delete('k2');
$redis->delete('k3');
$redis->delete('ko1');
$redis->delete('ko2');
$redis->delete('ko3');

$redis->zAdd('k1', 0, 'val0');
$redis->zAdd('k1', 1, 'val1');

$redis->zAdd('k2', 2, 'val2');
$redis->zAdd('k2', 3, 'val3');

$redis->zUnion('ko1', array('k1', 'k2')); /* 4, 'ko1' => array('val0', 'val1', 'val2', 'val3') */

/* Weighted zUnion */
$redis->zUnion('ko2', array('k1', 'k2'), array(1, 1)); /* 4, 'ko1' => array('val0', 'val1', 'val2', 'val3') */
$redis->zUnion('ko3', array('k1', 'k2'), array(5, 1)); /* 4, 'ko1' => array('val0', 'val2', 'val3', 'val1') */


zInter

计算numkeys个由keys指定的有序集合的交集,并且将结果存储在destination中。在该命令中,在你传递输入keys之前,必须提供输入keys的个数和其它可选的参数。
在默认情况下,一个元素的结果score是具有该元素的所有有序集合的score的和。关于WEIGHTS和AGGREGATE选项,可以参看ZUNIONSTORE命令。如果目标已经存在,那么它将会被重写。

$redis->delete('k1');
$redis->delete('k2');
$redis->delete('k3');

$redis->delete('ko1');
$redis->delete('ko2');
$redis->delete('ko3');
$redis->delete('ko4');

$redis->zAdd('k1', 0, 'val0');
$redis->zAdd('k1', 1, 'val1');
$redis->zAdd('k1', 3, 'val3');

$redis->zAdd('k2', 2, 'val1');
$redis->zAdd('k2', 3, 'val3');

$redis->zInter('ko1', array('k1', 'k2'));               /* 2, 'ko1' => array('val1', 'val3') */
$redis->zInter('ko2', array('k1', 'k2'), array(1, 1));  /* 2, 'ko2' => array('val1', 'val3') */

/* Weighted zInter */
$redis->zInter('ko3', array('k1', 'k2'), array(1, 5), 'min'); /* 2, 'ko3' => array('val1', 'val3') */
$redis->zInter('ko4', array('k1', 'k2'), array(1, 5), 'max'); /* 2, 'ko4' => array('val3', 'val1') */

### Redis ZSet 命令详解 #### 1. 添加元素到有序集合 (ZADD) `ZADD key score member [score member ...]` 此命令用于向给定键对应的有序集中添加一个或多个成员,或者更新已存在成员的分数。如果某个成员已经存在于该有序集中,则会更新其分数。 ```bash 127.0.0.1:6379> ZADD myzset 1 "one" (integer) 1 ``` 上述例子创建了一个名为 `myzset` 的有序集合并插入了带有分数 `1` 和值 `"one"` 的成员[^1]. #### 2. 获取有序集合中的成员数 (ZCARD) `ZCARD key` 返回存储在指定键下的有序集合里的成员总数。 ```bash 127.0.0.1:6379> ZCARD myzset (integer) 1 ``` 这段代码展示了如何查询之前定义好的 `myzset` 中有多少个元素. #### 3. 计算特定分数组内的成员数目 (ZCOUNT) `ZCOUNT key min max` 统计位于最小(`min`)和最大(`max`)之间的成员数量(包括边界),其中可以使用 `-inf` 表示负无穷大而 `+inf` 则代表正无穷大。 ```bash 127.0.0.1:6379> ZCOUNT score 80 90 (integer) 2 ``` 这里说明了当有一个叫作 `score` 的有序集合时,可以通过这条指令得知得分为 `80~90` 范围内的人数是多少[^2]. #### 4. 返回按升序排列后的全部/部分成员及其得分 (ZRANGE/ZRANGEBYSCORE) - **ZRANGE**: `ZRANGE key start stop [WITHSCORES]` 提取从索引位置 `start` 至 `stop` 的所有条目;可选参数 `WITHSCORES` 将连同它们各自的评分一起返回。 - **ZRANGEBYSCORE**: `ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]` 根据分数范围获取数据项,并允许进一步通过 `LIMIT` 子句限制结果的数量以及起始偏移量。 ```bash # 使用 ZRANGE 并带上 WITHSCORES 参数显示成员及对应分数 127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES 1) "one" 2) "1" # 或者按照分数区间检索记录 127.0.0.1:6379> ZRANGEBYSCORE myscoreset 5 10 WITHSCORES LIMIT 0 2 ... ``` 这些命令可以帮助用户轻松地访问有序集合中排序过的项目列表^. #### 5. 删除指定排名区间的成员 (ZREMRANGEBYRANK) `ZREMRANGEBYRANK key start stop` 删除处于由低至高第 `start` 名次到第 `stop` 名次之间(含两端)的所有成员。 ```bash 127.0.0.1:6379> ZREMRANGEBYRANK leaderboard 0 10 (integer) 11 ``` 这行脚本表示清除了排行榜上前十一名的数据. #### 6. 移除具有相同分数的最大/最小成员 (ZPOPMAX / ZPOPMIN) - **ZPOPMAX**: `ZPOPMAX key [count]` 找出并移走拥有最高分数的一个或多于一个成员。 - **ZPOPMIN**: `ZPOPMIN key [count]` 类似地作用于最低分数端。 ```bash # 弹出单个最高分成员 127.0.0.1:6379> ZPOPMAX scores 1) "highest_scored_item" 2) "its_score_value" # 同样适用于弹出多份最低分作品 127.0.0.1:6379> ZPOPMIN items 3 ... ``` 以上两条语句分别演示了怎样高效处理极端情况下的数据点. #### 应用实例:任务调度系统 为了构建基于时间戳的任务队列,可以选择利用 Sorted Sets 结构来管理待办事项: - 把计划执行的时间作为 Score; - Task ID 设为 Member Value; - 当到达设定时刻即刻取出相应的 task 进行下一步动作。 例如,在实际应用当中可能会像下面这样操作: ```bash # 插入新任务 127.0.0.1:6379> ZADD tasks 1672531200 "task_id_1" # 查询即将到期的任务们 127.0.0.1:6379> ZRANGEBYSCORE tasks "-inf" "+inf" WITHSCORES LIMIT 0 10 ... ``` 这种设计模式非常适合用来安排周期性的后台作业或是定时触发某些事件的发生[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值