1. 概念
- Redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据。
- 有序集合可以利用分数进行从小到大的排序。虽然有序集合的成员是唯一的,但是分数(score)却可以重复。比如在一个班中,学生的学号是唯一的,但是每科成绩却是可以一样的,redis可以利用有序集合存储学生成绩快速做成绩排名功能。
2. 常用命令
- zadd 命令:用于向一个有序集合中加入一个或者多个元素及其分数。假如加入的元素已经存在,那么更新这个成员的分数值,然后进行重新插入,来定位自己的位置。如果key不存在,那么创建一个新的有序集合并进行插入操作。
- Zcard 命令:用于计算有序集合中元素的数量。
- Zcount 命令:用于计算有序集合中指定分数区间的成员数量。
计算:如上图所示80至90分之间的数量 - zrange 命令:用于返回指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。这里的下标参数都是从0开始的,负数代表是从最后一个成员算起,-1表示最后一个成员。
- ZREVRANGE 命令:用于返回指定分数区间内的成员。其中成员的位置按分数值递减(从大到小)来排序。
- Zrangebyscore 命令:用于返回有序集合中指定分数区间的成员列表。其中集合成员按分数值递增(从小到大)来排序。
- Zrank命令:用于返回有序集中指定成员的排名,返回值越大,排名越靠前。
- Zrem 命令:用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
- Zremrangebyrank 命令:用于移除有序集中,指定排名(rank)区间内的所有成员。
- Zscore 命令:返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil。
- Zscan 命令:用于迭代有序集合中的元素(包括元素成员和元素分值)。
3. zset类型应用场景
- 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。部分核心代码如下:
public function show(Product $product,Request $request)
{
if (!$product->status){
throw new \Exception("商品未上架");
}
if (!Redis::exists("product:".$product->id.":count")){
Redis::set("product:".$product->id.":count",1);
}else{
Redis::incr("product:".$product->id.":count",1);
}
Redis::zadd("product:Ranking",Redis::get("product:".$product->id.":count"),$product-
>id);
return view("product.productShow",["product" => $product]);
}
商品每被浏览一次,redis就使用string进行一次记录,同时zset类型会根据string的记录对相关商品的分数进行修改,保证商品排行的实时更新。
- 抢票当中的加速包:用户买了加速包就给分数加分,分值越高抢到的几率越大。