1. Redis ZSET 的跳表实现细节中节点结构(score/member/level/span)、backward 指针的作用、zslRandomLevel 的概率参数选择(p=1/4 vs p=1/2)
说明 Redis ZSET 的跳表实现细节,包括节点结构(score/member/level/span)、backward 指针的作用,以及 zslRandomLevel 的概率参数选择(p=1/4 vs p=1/2)?
- 跳表节点结构(score、member、level 数组、span、backward)
- backward 指针用于逆序/倒序遍历
- zslRandomLevel 的 p 参数选择
Redis ZSET 的跳表节点包含 score(排序键)、member(成员)、level 数组(每层 forward 指针和 forward 跨过的节点数 span)、backward 指针(指向同一层前驱,用于逆序 range 查询和便于删除)。分数相同按 member 字典序比较。backward 指针使 Redis 能方便地倒序遍历(ZREVRANGE)和定位前驱。zslRandomLevel 按概率 p 决定是否提升层数:Redis 用 p=1/4(约 25%),使期望层数约 1/(1-p)=4/3,节点层数小、内存省,同时保证查找 O(log n);p=1/2 则层级更密、查找更快但内存翻倍。p=1/4 是内存与速度的折中。
span 字段让 Redis 能 O(1) 计算排名(rank);backward 支撑逆序操作。p=1/4 降低平均层数(内存),因为 Redis 里跳表主要用于有序集合,内存开销敏感,而 p=1/2 多用于理论最简模型。zslRandomLevel 上限 32 层。