什么是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表。
