Redis的数据结构之ZSet

208 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

简介

zset有序且是不重复的列表,类似于Java中的SortSet和HashMap的结合,在redis中是通过两种底层数据结构实现的。一种是ziplist压缩列表,另一种就是Redis中最经典的数据结构skipList跳跃表。

数据结构

ziplist压缩列表

满足以下两个条件:

  • 每个元素的长度小于64个字节,
  • [Score,value]键值对数量少于128个

关于ziplist的数据结构,之前的章节已经讲解了,本章不在讲述。

skipList跳跃表

简介

跳跃表(skiplist)是一种随机化的数据,对链表进行改造,在链表上建索引,即每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引。这种链表加多级索引的结构,就是跳表。

基本结构

图片.png

说明:跳跃表主要由以下部分构成:

  • 表头(head):负责维护跳跃表的节点指针。
  • 跳跃表节点:保存着元素值,以及多个层。
  • 层:保存着指向其他元素的指针。高层的指针越过的元素数量大于等于低层的指针,为了提高查找的效率,程序总是从高层先开始访问,然后随着元素值范围的缩小,慢慢降低层次。
  • 表尾:全部由NULL组成,表示跳跃表的末尾。

常用命令

图片.png

zadd 添加元素

基本语法

zadd key score1 member1

示例

图片.png

zscore 获取元素分数

基本语法

zscore key member

示例

图片.png

zrange 获得排名在某个范围的元素列表

基本语法

zrange key start stop

示例

图片.png

zrangebyscore 获取指定分数范围的元素

基本语法

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

1.显示分数为5-10的集合的值。

zrangebyscore myset (5 (100

图片.png

2.显示整个有序成员的score值

zrangebyscore salary -inf +inf withscores 

图片.png

zincrby 增加某个元素的分数

基本语法

 zincrby key score member

示例

图片.png

zcard 获得集合中元素的数量

基本语法

 zcard key

示例

图片.png

zcount 获得指定分数范围内的元素个数

基本语法

 zcount key min max

示例

图片.png

zrem 删除一个或多个元素

基本语法

 zrem key member

示例

图片.png

zremrangebyscore 按照分数/排名删除元素

基本语法

 zremrangebyscore key min max

示例

图片.png

zrank/zrevrank 获取元素排名(升序或者降序)

基本语法

 zrank key member

示例

图片.png

说明:1表示排名第二

zscan 迭代有序集合中的元素

基本语法

 zscan key cursor match pattern

示例

图片.png

应用场景

  • 1.记录热榜帖子ID列表总热榜和分类热榜.
  • 2.记录帖子的点赞用户ID列表、评论ID列表,用于显示和去重计数。

总结

本文讲解了Redis的ZSet数据结构和相关操作,采用zSet对于大数据量进行相关的精确统计时,效率非常低,内存开销大,在生产环境尽量避免操作。