Redis-zset类型与结构

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

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的记录对相关商品的分数进行修改,保证商品排行的实时更新。

  • 抢票当中的加速包:用户买了加速包就给分数加分,分值越高抢到的几率越大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值