1. 有序集合(string)
有序集合类型 (Sorted Set或ZSet) 相比于集合类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序。
2. 内部实现
有序集合是由 ziplist (压缩列表) 或 skiplist (跳跃表) 组成的。
当数据比较少时,有序集合使用的是 ziplist 存储的,有序集合使用 ziplist 格式存储必须满足以下两个条件:
- 有序集合保存的元素个数要小于 128 个;
- 有序集合保存的所有元素成员的长度都必须小于 64 字节。
如果不能满足以上两个条件中的任意一个,有序集合将会使用 skiplist 结构进行存储。
3. 常用命令
命令 | 描述 |
zadd key score1 member1 [score2 member2] | 添加集合或者更新 |
zcard key | 获取集合数量 |
zcount key min max | 获取集合中指定区间数量 |
zincrby key increment member | 集合中对指定成员的数增量 increment |
zinterstore destination numkeys key [key ...] | 批量计算交集并将结果集存储在新的集合 destination 中 |
zlexcount key min max | 在集合中计算指定字典区间内成员数量 |
zrange key start stop [WITHSCORES] | 通过索引区间返回元素 |
zrangebylex key min max [LIMIT offset count] | 通过字典区间返回元素 |
zrangebyscore key min max [WITHSCORES] [LIMIT] | 通过分数返回指定区间内的成员 |
zrank key member | 返回指定成员的索引 |
zrem key member [member ...] | 批量移除集合元素 |
zremrangebylex key min max | 移除给定的区间的成员 |
zremrangebyrank key start stop | 移除给定排名区间元素 |
zremrangebyscore key min max | 移除给定的分数区间元素 |
zrevrange key start stop [WITHSCORES] | 返回指定区间内的成员,通过索引,分数从高到低 |
zrevrangebyscore key max min [WITHSCORES] | 返回有指定分数区间内的成员,分数从高到低排序 |
zrevrank key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
zscore key member | 返回有序集中,成员的分数值 |
zunionstore destination numkeys key [key ...] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
zscan key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素 |
4. 使用场景
- 排行榜系统
如学生成绩的排名。某视频网站的用户点赞、播放排名、电商系统中商品的销量排名 - 电话号码排序
使用ZRANGEBYLEX或ZREVRANGEBYLEX可以帮助我们实现电话号码或姓名的排序