1、概述
- Redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。
- 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
- 因为元素是有序的,所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
- 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
2、相关操作
- zadd key score1 member1 [score2 member2…]-----------添加一个或多个元素,并给每个元素设置分数,返回成功插入个数
- zcard key-----------获取集合元素个数
- zcount key min max------------统计score在[min,max]区间的元素数量
- zlexcount key min max-------------在有序集合中计算指定字典区间内成员数量,字典序(lexicographical order )
- zrange key start stop [WITHSCORES]-----------返回按score从小到大排序后且索引在[start,stop]区间的元素,从0开始
- zrangebyscore key min max [WITHSCORES] [LIMIT]--------------返回按score从小到大排序后且分数在[min,max]区间的元素
- zrevrange key start stop [WITHSCORES]----------------返回按score从大到小排序后且索引在[start,stop]区间的元素,从0开始
- zrevrangebyscore key max min[WITHSCORES]------------------返回按score从大到小排序后且分数在[min,max]区间的元素
- zrangebylex key min max[LIMIT offset count]--------------通过字典区间返回有序集合的成员
- zrank key member-------------返回元素member的索引,不存在nil
- zrevrank key member--------------返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
- zscore key member---------------返回有序集合中,元素member分数
- zscan key cursor [MATCH pattern] [COUNT count]-------------迭代有序集合中的元素(包括元素的分值)
- zunionstore destination numkeys key [key …]-------------计算给定的一个或多个有序集的并集,并存储在新的 key 中
- zinterstore destination numkeys key [key …]--------------计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
- zincrby key increment member-----------有序集合中对指定元素的分数加上增量 increment
- zrem key member[member…]-----------移除有序集合中的一个或多个元素
- zremrangebylex key min max-----------移除有序集合中给定的字典区间的所有成员
- zremrangebyrank key start stop---------移除有序集合中给定的排名区间的所有成员
- zremrangebyscore key min max-------移除有序集合中给定的分数区间的所有成员
3、数据结构
ortedSet (zset) 是 Redis 提供的一个非常特别的数据结构,一方面它等价于 Java 的数据结构 Map<String, Double>,可以给每一个元素 value 赋予一个权重 score,另一方面它又类似于 TreeSet,内部的元素会按照权重 score 进行排序,可以得到每个元素的名次,还可以通过 score 的范围来获取元素的列表。
zset 底层使用了两个数据结构:
- hash,hash 的作用就是关联元素 value 和权重 score,保障元素 value 的唯一性,可以通过元素 value 找到相应的 score 值。
- 跳跃表,跳跃表的目的在于给元素 value 排序,根据 score 的范围获取元素列表。