简介
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,在某些方面和列表类型有些相似。
1、二者都是有序的
2、二者都可以获得某一范围的元素
但二者有着很大的区别,这使得他们的应用场景不同。
1、列表类型是通过链表实现的,获取靠近两端的数据极快,二元素增多后,访问中间数据的速度会较慢,所以他更加适合日志这样很少访问中间元素的应用
2、有序集合类型是使用散列表和跳跃表实现的,所以即使读取中间部分的数据速度也很快,时间复杂度是O(lang(N))
3、列表中不能简单的调整某个元素的位置,但有序集合可以(通过更改合格元素的分数)
4、有序集合要比列表类型更耗费内存
常用命令
1、添加value:ZADD page_rank 10 google.com
其中10是score,可以认为
127.0.0.1:6379> ZADD page_rank 10 google.com
(integer) 1
127.0.0.1:6379> zrange page_rank 0 -1
1) "google.com"
127.0.0.1:6379> zrange page_rank 0 -1 withscores
1) "google.com"
2) "10"
127.0.0.1:6379>
同时添加
127.0.0.1:6379> zadd page_rank 9 www.baidu.com 8 www.qq.com
(integer) 2
127.0.0.1:6379> zrange page_rank 0 -1 withscores
1) "www.qq.com"
2) "8"
3) "www.baidu.com"
4) "9"
5) "google.com"
6) "10"
127.0.0.1:6379>
2、获取所有元素:zrange page_rank 0 -1 withscores
127.0.0.1:6379> zrange page_rank 0 -1 withscores
1) "www.qq.com"
2) "8"
3) "www.baidu.com"
4) "9"
5) "google.com"
6) "10"
127.0.0.1:6379>
3、获取所有元素(根据重要性倒叙):zrevrange page_rank 0 -1 withscores
127.0.0.1:6379> zrevrange page_rank 0 -1 withscores
1) "google.com"
2) "10"
3) "www.baidu.com"
4) "9"
5) "www.qq.com"
6) "8"
127.0.0.1:6379>
4、获取score范围的value:zrangebyscore:page_rank 9 10
127.0.0.1:6379> zrevrange page_rank 0 -1 withscores
1) "google.com"
2) "10"
3) "www.baidu.com"
4) "9"
5) "www.qq.com"
6) "8"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> zrangebyscore page_rank 9 10
1) "www.baidu.com"
2) "google.com"
127.0.0.1:6379>
5、获取score范围的value个数:zcount page_rank 9 10
127.0.0.1:6379> zcount page_rank 9 10
(integer) 2
127.0.0.1:6379>
6、返回value的排名:zrank page_rank www.qq.com
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
127.0.0.1:6379> zrevrange page_rank 0 -1 withscores
1) "google.com"
2) "10"
3) "www.baidu.com"
4) "9"
5) "www.qq.com"
6) "8"
127.0.0.1:6379> zrank page_rank www.qq.com
(integer) 0
127.0.0.1:6379> zrank page_rank www.baidu.com
(integer) 1
127.0.0.1:6379> zrank page_rank google.com
(integer) 2
127.0.0.1:6379>
7、获取value的分值score:zscore page_rank google.com
127.0.0.1:6379> zscore page_rank google.com
"10"
127.0.0.1:6379>
8、提高value的分值score: zincrby page_rank 1 google.com
127.0.0.1:6379> zscore page_rank google.com
"10"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> zincrby page_rank 1 google.com
"11"
127.0.0.1:6379> zscore page_rank google.com
"11"
127.0.0.1:6379>
应用场景
常应用于:排行榜
1、比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
2、比如一个存储全班同学成绩的Sorted Set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
3、还可以用Sorted Set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。