Redis-zset类型与结构

本文介绍了Redis有序集合的基本概念,展示了其独特的数据结构特点,并详细解释了常用命令的应用场景,如排行榜管理和抢票加速包功能。

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

1. 概念

  • Redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据。
  • 有序集合可以利用分数进行从小到大的排序。虽然有序集合的成员是唯一的,但是分数(score)却可以重复。比如在一个班中,学生的学号是唯一的,但是每科成绩却是可以一样的,redis可以利用有序集合存储学生成绩快速做成绩排名功能。

2. 常用命令

  1. zadd 命令:用于向一个有序集合中加入一个或者多个元素及其分数。假如加入的元素已经存在,那么更新这个成员的分数值,然后进行重新插入,来定位自己的位置。如果key不存在,那么创建一个新的有序集合并进行插入操作。
    在这里插入图片描述
  2. Zcard 命令:用于计算有序集合中元素的数量。
    在这里插入图片描述
  3. Zcount 命令:用于计算有序集合中指定分数区间的成员数量。
    在这里插入图片描述
    计算:如上图所示80至90分之间的数量
  4. zrange 命令:用于返回指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。这里的下标参数都是从0开始的,负数代表是从最后一个成员算起,-1表示最后一个成员。
    在这里插入图片描述
  5. ZREVRANGE 命令:用于返回指定分数区间内的成员。其中成员的位置按分数值递减(从大到小)来排序。
    在这里插入图片描述
  6. Zrangebyscore 命令:用于返回有序集合中指定分数区间的成员列表。其中集合成员按分数值递增(从小到大)来排序。
    在这里插入图片描述
  7. Zrank命令:用于返回有序集中指定成员的排名,返回值越大,排名越靠前。
    在这里插入图片描述
  8. Zrem 命令:用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
    在这里插入图片描述
  9. Zremrangebyrank 命令:用于移除有序集中,指定排名(rank)区间内的所有成员。
    在这里插入图片描述
  10. Zscore 命令:返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil。
    在这里插入图片描述
  11. 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的记录对相关商品的分数进行修改,保证商品排行的实时更新。

  • 抢票当中的加速包:用户买了加速包就给分数加分,分值越高抢到的几率越大。
### Redis ZSet 类型 使用方法和功能介绍 RedisZSet(有序集合)类型是一种非常强大的数据结构,它结合了 Set 和 Hash 的特性。ZSet 中的每个成员都是唯一的,并且一个分数(score)相关联,这个分数用于对集合中的成员进行排序[^4]。 #### 1. ZSet 的基本操作 以下是 ZSet 的一些常用命令及其功能: - **ZADD**:向 ZSet 中添加一个或多个成员,或者更新已存在成员的分数。 ```python redis> ZADD myzset 1 "one" 2 "two" ``` 上述命令将成员 `one` 和 `two` 添加到 `myzset` 中,并分别设置分数为 1 和 2[^3]。 - **ZRANGE**:返回按分数从小到大排序的成员列表。 ```python redis> ZRANGE myzset 0 -1 WITHSCORES ``` 返回从索引 0 到 -1(即所有成员)的成员及对应的分数。 - **ZREVRANGE**:返回按分数从大到小排序的成员列表。 ```python redis> ZREVRANGE myzset 0 -1 WITHSCORES ``` - **ZINCRBY**:增加指定成员的分数值。 ```python redis> ZINCRBY myzset 2 "one" ``` 将成员 `one` 的分数增加 2[^2]。 - **ZREM**:移除一个或多个成员。 ```python redis> ZREM myzset "one" ``` - **ZCARD**:返回 ZSet 中成员的数量。 ```python redis> ZCARD myzset ``` - **ZSCORE**:返回指定成员的分数。 ```python redis> ZSCORE myzset "two" ``` #### 2. ZSet 的范围操作 ZSet 支持基于分数或排名的范围查询,这使得它非常适合用于排行榜等场景。 - **ZRANGEBYSCORE**:返回指定分数范围内的成员。 ```python redis> ZRANGEBYSCORE myzset 1 2 ``` 返回分数在 1 到 2 范围内的成员[^3]。 - **ZREMRANGEBYSCORE**:删除指定分数范围内的成员。 ```python redis> ZREMRANGEBYSCORE myzset 0 1 ``` - **ZRANK** 和 **ZREVRANK**:返回成员的排名(基于分数从小到大或从大到小)。 ```python redis> ZRANK myzset "two" ``` #### 3. ZSet 的集合操作 ZSet 还支持集合运算,如交集和并集。 - **ZINTERSTORE**:计算多个 ZSet 的交集,并将结果存储到新的 ZSet 中。 ```python redis> ZINTERSTORE out 2 myzset1 myzset2 ``` - **ZUNIONSTORE**:计算多个 ZSet 的并集,并将结果存储到新的 ZSet 中。 ```python redis> ZUNIONSTORE out 2 myzset1 myzset2 ``` #### 4. ZSet 的内部实现 ZSet 的内部实现有两种编码方式:ziplist 和 skiplist+dict[^5]。 - **ziplist(压缩列表)**:当 ZSet 的成员数量较少且每个成员的值较小时,Redis 使用 ziplist 来存储 ZSet,这种方式可以节省内存[^5]。 - **skiplist(跳表)**:当 ZSet 的成员数量较多或成员值较大时,Redis 使用 skiplist 来存储 ZSet,这种方式能够保证高效的插入、删除和查询操作[^5]。 #### 5. ZSet 的应用场景 由于 ZSet 支持按分数排序的功能,它非常适合用于以下场景: - **排行榜系统**:如微博热搜、游戏天梯排行、学生成绩排行等[^5]。 - **任务队列**:根据优先级排序的任务队列。 - **地理信息**:基于距离的排序,例如附近的人功能。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值