前言
有序集合类型是Redis五种数据类型中最高级的、也是最复杂的类型。
继上篇讲解set后,我们来看set与sorted set区别
与set相比,sorted sets就是将set中的元素增加一个权重参数:score,使得集合中元素能够按score有序排列,是插入有序的,即自动排序。这里需要注意的是尽管sorted-sets的成员必须是唯一的,但是score是可以重复的。当需要一个有序的并且不重复的集合列表时,这时就可以考虑sorted set数据结构
应用场景
1、twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
2、一个游戏的用户得分排行榜
3、带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。
例子
假设要处理考试成绩,首先要将学生姓名以及成绩录入
kongweiyan 成绩是70
liming 成绩是60
jenny 成绩是50.5
录入完毕了,下面我们进行取出数据,正序(ZRANGE),倒序(ZREVRANGE)
如果,想要一个分段的统计呢,比如要60分以上的,即及格的,正序(ZRANGEBYSCORE),倒序(ZREVRANGEBYSCORE)
实现原理
用到了两个数据结构:hash table和skip list(跳跃表),hash table中放的是成员到score的映射,跳跃表是所有的成功。 hash table是使用redis中的dict(即字典)来实现的。主要是为了保证查询效率为O(1)。但是跳跃表是主要是保证元素有序并能够保证INSERT和REMOVE操作是O(logn)的复杂度。至于详细的跳跃表的基本原理,可以参考下这篇文章:http://blog.sina.com.cn/s/blog_72995dcc01017w1t.html
延伸
分页查询
注:key1是这个sortedset的key,最后一行:zrange key1 3 5:意思是pagesize=3,取第二页,下标3到5
根据下标去取,可以实现任意分页查询,性能也很好,实现高速分页查询。
小结
redis的五种基本数据类型到此就介绍完毕了,在具体使用中,要结合不同的场景进行使用,还有一些其他功能的使用场景:如:订阅-发布系统;事务等等。下篇将介绍redis的一些基本操作