redis 有序集合(sorted set)详解和应用场景
redis是一个高速缓存的key-values数据库,它支持五种的数据类型,包括字符串类型(String)、列表(list)、集合(set)、有序集合(zset)、哈希(hash)。下面我们来详细分析redis集合(set)类型的使用和应用场景。
一、redis有序集合(sorted set)
redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据。
有序集合可以利用分数进行从小到大的排序。虽然有序集合的成员是唯一的,但是分数(score)却可以重复。就比如在一个班中,学生的学号是唯一的,但是每科成绩却是可以一样的,redis可以利用有序集合存储学生成绩快速做成绩排名功能。
二、常用命令:
1、Zadd 命令:向一个有序集合中加入一个或者多个元素及其分数。假如加入的元素已经存在,那么更新这个成员的分数值,然后进行重新插入,来定位自己的位置。如果key不存在,那么创建一个新的有序集合并进行插入操作。命令如下:(向一个学生成绩有序集合当中加入几个学生成绩信息)
zadd score 80 tom 94 cate 90 andy zadd score 95 taylor
2、Zcard 命令:用于计算有序集合中元素的数量。命令如下:
zcard score
3、Zcount 命令:用于计算有序集合中指定分数区间的成员数量。命令如下:
zcount score 80 90
4、Zrange 命令: 用于返回指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。这里的下标参数都是从0开始的,负数代表是从最后一个成员算起,-1表示最后一个成员。可以参考上面例子当中的结果。
5、ZREVRANGE 命令:用于返回指定分数区间内的成员。其中成员的位置按分数值递减(从大到小)来排序。命令如下:
zrevrange score 0 -1
6、Zrangebyscore 命令: 返回有序集合中指定分数区间的成员列表。其中集成员按分数值递增(从小到大)来排序。命令如下:
zrangebyscore score 80 90
7、Zrank命令:用于返回有序集中指定成员的排名。命令如下:(获取andy成绩排名是第二名)
Zrank score andy
8、Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。命令如下:(移除andy的成绩)
zrem socre andy zrange score 0 -1 withscores
10、Zremrangebyrank 命令用于移除有序集中,指定排名(rank)区间内的所有成员。命令如下:(删除 排名最后的学生,即tom)
zremrangebyrank score 0 0 zrange score 0 -1 withscores
11、 Zscore 命令:返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。命令如下:(再加入一个学生tony,成绩95,)
zadd score 95 tony zscore score tony
12、Zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。命令如下:(对成绩集合进行循环找到符合特定条件的成员)
zscan score 0 match t*
三、应用场景:
有序集合的使用场景与集合类似,但是set集合不是自动有序的,而sorted set可以利用分数进行成员间的排序,而且是插入时就排序好。所以当你需要一个有序且不重复的集合列表时,就可以选择sorted set数据结构作为选择方案。
1、 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
2、用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论