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

Zadd 命令

2、Zcard 命令:用于计算有序集合中元素的数量。命令如下:

zcard score

Zcard 命令

3、Zcount 命令:用于计算有序集合中指定分数区间的成员数量。命令如下:

zcount score 80 90

Zcount 命令

4、Zrange 命令: 用于返回指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。这里的下标参数都是从0开始的,负数代表是从最后一个成员算起,-1表示最后一个成员。可以参考上面例子当中的结果。

5、ZREVRANGE 命令:用于返回指定分数区间内的成员。其中成员的位置按分数值递减(从大到小)来排序。命令如下:

zrevrange score 0 -1

ZREVRANGE 命令

6、Zrangebyscore 命令: 返回有序集合中指定分数区间的成员列表。其中集成员按分数值递增(从小到大)来排序。命令如下:

zrangebyscore score 80 90

Zrangebyscore 命令

7、Zrank命令:用于返回有序集中指定成员的排名。命令如下:(获取andy成绩排名是第二名)

Zrank score andy

Zrank命令

8、Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。命令如下:(移除andy的成绩)

zrem socre andy 
zrange score 0 -1 withscores

Zrem 命令

10、Zremrangebyrank 命令用于移除有序集中,指定排名(rank)区间内的所有成员。命令如下:(删除 排名最后的学生,即tom)

zremrangebyrank score 0 0
zrange score 0 -1 withscores

Zremrangebyrank

11、 Zscore 命令:返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。命令如下:(再加入一个学生tony,成绩95,)

zadd score 95 tony 
zscore score  tony

 Zscore 命令

12、Zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。命令如下:(对成绩集合进行循环找到符合特定条件的成员)

zscan score 0 match t*

Zscan 命令


三、应用场景:

有序集合的使用场景与集合类似,但是set集合不是自动有序的,而sorted set可以利用分数进行成员间的排序,而且是插入时就排序好。所以当你需要一个有序且不重复的集合列表时,就可以选择sorted set数据结构作为选择方案。

1、   排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

2、用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。