Redis-ZSet

leard 发布于 2025-06-06 3 次阅读


什么是ZSet

ZSet(sorted set)是有跳表(skip list)和哈希表(hash table)组成的数据结构。ZSet结合了set的特性并多了排序功能。

ZSet的一些操作

  • 插入:zadd
    • 使用hash表存储成员和分数的映射关系,分数作为hash表中的值
    • 同时将成员和分数插入跳表,跳表会根据分数排序
    • 如果是更新,会在hash表中更新成员的分数,然后在跳表中更新成员的位置
  • 删除:zrem
    • hash表中删除成员的映射
    • 跳表删除该成员
  • 查询:zscore
  • 范围查询:zrange

跳表

跳表是通过多层链表来实现的,从最上层开始,每一层是下一层的子集,最下层包含所有元素。

  • 查询
    • 从最高层开始,逐层向下,直到找到目标元素或者确定元素不存在。时间复杂度为O(log n)
  • 插入
    • 先查询插入位置,然后决定新节点的层数,最后在相应层中插入节点并更新指针
  • 删除
    • 从最高层开始查询要删除的节点,然后在各层中更新指针

Hash

Redis的hash是一种键值对集合,可以将多个字段和值存储在同一个键中。hash的底层数据结构由紧凑列表和hash表组成。当hash类型的元素个数小于hash-max-ziplist-entries或者hash的key值大小小于64时,使用紧凑列表,反之使用hash表。