1.关于sorted set我们可以理解为有一张表,表有两列,一列存value,还有一列存顺序,操作中的key理解为zset的名字.
当元素被添加到集合中时候,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是o(1).另一个socre到元素的映射被添加到skip list,并按照score排序,所以就可以有序的获取集合中的元素.添加,删除操作开销都是o(log(N))和skip list的开销一致,redis的skip list实现用的是双向链表,这样就可以逆序从尾部取数据.
sorted set最常用的使用方式应该是作为索引来使用,我么可以把要排序的字段作为score存储,对象的id做元素存储,下面对sorted set相关命令介绍.
2.相关命令介绍:
2.1 zadd ,向key中添加元素member,score用于排序.如果元素存在,则根据score更新改元素的顺序
127.0.0.1:6379> zadd myzset 1 id1(integer) 1127.0.0.1:6379> zadd myzset 2 id2(integer) 1127.0.0.1:6379> zadd myzset 3 id3(integer) 1127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id1"2) "1"3) "id2"4) "2"5) "id3"6) "3"
zadd添加可以为myzset,member为id1,id2,id3,对应score分别为1,2,3的元素
如果一个member设置两次,那么以最后一次为准
zrange查看key为myzset中存在的元素,如果加上withscores,那么会显示members和score
2.2 zrem,删除key中对应member的元素
127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id1"2) "1"3) "id2"4) "2"5) "id3"6) "3"127.0.0.1:6379> zrem myzset id2(integer) 1127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id1"2) "1"3) "id3"4) "3"
可以看到key为myzset的member为id2的这条记录删除了
2.3 zincrby 如果名称为key的zset中已经存在元素member,则改元素的score增加increment;否则向集合中添加改元素,其score的值为increment
127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id1"2) "1"3) "id3"4) "3"127.0.0.1:6379> zincrby myzset 2 id1"3"127.0.0.1:6379> zincrby myzset 2 id4"2"127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id4"2) "2"3) "id1"4) "3"5) "id3"6) "3"
可以看到id4是新增的,id1的score增加了2变为3
2.4 zrank ,返回名称为key的zset中member元素的排名(按照score从小到大的顺序排),值是下标
127.0.0.1:6379> zrank myzset id1(integer) 1127.0.0.1:6379> zrank myzset id3(integer) 2127.0.0.1:6379> zrank myzset id4(integer) 0
下标从0开始的,一次id4最小排在最前面.
2.5 zrevrank ,返回名称为key的zset中member元素的排名(按照从大到校的顺序排),取的是小标值
127.0.0.1:6379> zrevrank myzset id4(integer) 2127.0.0.1:6379> zrevrank myzset id3(integer) 0127.0.0.1:6379> zrevrank myzset id1(integer) 1
2.6 zrevrange ,返回名称为key的zset(按照score栋大到小排序)中的index从start到end的所有元素
127.0.0.1:6379> zrevrange myzset 0 -1 withscores1) "id3"2) "3"3) "id1"4) "3"5) "id4"6) "2"127.0.0.1:6379> zrevrange myzset 0 1 withscores1) "id3"2) "3"3) "id1"4) "3"
首先按 score 从大到小排序,再取出全部元素
2.7 zrangebyscore ,返回集合中score在给定区间的元素
127.0.0.1:6379> zrangebyscore myzset 2 3 withscores1) "id4"2) "2"3) "id1"4) "3"5) "id3"6) "3"127.0.0.1:6379> zrangebyscore myzset 3 3 withscores1) "id1"2) "3"3) "id3"4) "3"
2.8 zcount返回集合中score在给定区间的数量
127.0.0.1:6379> zcount myzset 3 3(integer) 2127.0.0.1:6379> zcount myzset 2 3(integer) 3
值为3的有2个,值在2-3的有3个
2.9 zcard 返回集合中元素的个数
127.0.0.1:6379> zcard myzset(integer) 3
可以发现key为myzset的集合有3个元素
2.10 zscore 返回给定元素对应的score
127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id4"2) "2"3) "id1"4) "3"5) "id3"6) "3"127.0.0.1:6379> zscore myzset id1"3"
2.11 zremrangebyrank ,删除集合中排名在给定区间的元素
127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id4"2) "2"3) "id1"4) "3"5) "id3"6) "3"127.0.0.1:6379> zremrangebyrank myzset 2 2(integer) 1127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id4"2) "2"3) "id1"4) "3"
可以看到排名区间第二到第二的是id3,因此把id3删除掉了
2.12 zremrangebyscore ,删除集合中score在给定区间的元素
127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id4"2) "2"3) "id1"4) "3"127.0.0.1:6379> zremrangebyscore myzset 1 2(integer) 1127.0.0.1:6379> zrange myzset 0 -1 withscores1) "id1"2) "3"
可以看到score从1-2的只有id4,因此id4被删除了