type
status
date
slug
summary
tags
category
icon
password
创建时间
Sep 7, 2024 02:25 PM
我觉得要说明 ZSet 的范围查询的时间复杂度是多少,需要根据 zset 的底层结构来说明。redis 数据类型和底层数据结构的对应关系
Redis的配置文件中关于有序集合底层实现的两个配置。
zset-max-ziplist-entries 128
:zset 采用压缩列表时,元素个数最大值。默认值为 128。
zset-max-ziplist-value 64
:zset 采用压缩列表时,每个元素的字符串长度最大值。默认值为 64。当满足以下任一条件时,Redis 便会将 zset 的底层实现由压缩列表转为跳跃表。
- zset中元素个数大于
zset_max_ziplist_entries
;
- 插入元素的字符串长度大于
zset_max_ziplist_value
。
- 压缩列表(ziplist) :
- Redis 在某些情况下会使用压缩列表来存储 ZSet,特别是在元素数量较少且每个元素都很小的时候。
- 压缩列表是一种紧凑的数据结构,它通过顺序扫描来查找和操作数据。
- 因此,对于范围查询操作,如
ZRANGEBYSCORE
或ZRANGEBYLEX
,其时间复杂度为 ,其中 是匹配范围内的元素数量。
- 跳表(skiplist) :
- 当 ZSet 中的元素数量较多或单个元素比较大时,Redis 会使用跳表来实现有序集合。
- 跳表是一种分层链表,可以在平均 时间内进行插入、删除和查找操作,其中 是集合中的总元素数。
- 对于范围查询操作,如
ZRANGEBYSCORE
或ZRANGEBYLEX
,其时间复杂度为 ,其中 :用于定位起始点的位置, :是匹配范围内的元素数量
总结来说:
- 使用压缩列表时:范围查询复杂度为
- 使用跳表时:范围查询复杂度为