ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

system-design-notes:图解跳表(Skip List),有序集合背后的核心数据结构

system-design-notes:图解跳表(Skip List),有序集合背后的核心数据结构 system-design-notes图解跳表Skip List有序集合背后的核心数据结构【免费下载链接】system-design-notesNotes of the book System Desgin Interview - An Insiders Guide项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-notessystem-design-notes 是《System Design Interview》一书的 28 章系统设计面试笔记合集。其中第 25 章实时游戏排行榜用一个真实场景深入讲解了 Redis有序集合Sorted Set背后的核心数据结构 ——跳表Skip List为什么几千万玩家的排行榜能做到毫秒级更新排名答案就藏在这套多层索引的结构里。本文带你完整图解跳表的工作原理、查找加速过程与时间复杂度。 本章完整笔记见25. Real-time Gaming Leaderboard/README.md全书目录见 Readme.md。一、从游戏排行榜说起跳表解决什么问题先看一个典型需求为一款月活 2500 万25mil MAU的手游设计实时排行榜要满足展示 Top 10 玩家显示任意玩家的具体名次如我排第 358 名玩家每赢一局加 1 分峰值2500 次/秒的实时更新![游戏排行榜展示排名、玩家与分数的实时榜单](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/25. Real-time Gaming Leaderboard/images/leaderboard.png?utm_sourcegitcode_repo_files)如果只用关系型数据库查某用户排名需要一条嵌套子查询对全表做COUNT扫描数据量大时根本无法扩展。 关键洞察排行榜本质上是一个永远有序的集合。我们需要一种数据结构在保持有序的同时支持快速查找、插入、定位名次。二、跳表结构图解多层索引如何实现加速跳表Skip List可以理解为在一条有序链表的上方叠加一层又一层快速通道索引。底层Base list是完整有序链表上层索引只抽取部分节点层数越高、节点越稀疏![跳表结构图解Base list 与 Level 1、Level 2 多级索引的 Skip List](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/25. Real-time Gaming Leaderboard/images/skip-list.png?utm_sourcegitcode_repo_files)以图中为例查找目标值45的过程从最高层Level 2 index出发跳到 15下一层Level 1 index继续前进到 36回到底层链表只需再走一步就到达 45。对比直接在底层链表逐个遍历路径大幅缩短 —— 这正是跳表跳跃式查找的精髓。三、Skip List 性能实测64 个节点快多少在 64 个节点的示例中查找同一目标值结构需要遍历的节点数纯底层链表62 个节点跳表Skip List11 个节点![跳表查找路径 vs 底层链表遍历路径的性能对比](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/25. Real-time Gaming Leaderboard/images/skip-list-performance.png?utm_sourcegitcode_repo_files)时间复杂度为什么是 O(log N)每层大约以 1/2 的概率保留下层节点层数期望为O(log N)每一层上平均只需前进 O(1) 步即可下降一层因此查找、插入、删除的期望时间复杂度都是 O(log N)。⚡ 相比红黑树跳表无需复杂的旋转平衡实现更简单且天然支持范围查询Range 查询这也是 Redis 选择它的原因。四、Redis 有序集合跳表的实战载体Redis 的 Sorted Set 内部由两部分组成见 README.md#L207-L235Hash 表member → scoreO(1) 直接取分Skip Listscore → member保持有序支撑排名与范围查询。![Redis 有序集合 Sorted Setscore 与 member 的有序映射](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/25. Real-time Gaming Leaderboard/images/sorted-set.png?utm_sourcegitcode_repo_files)对应到排行榜场景常用命令及其复杂度如下命令作用时间复杂度ZADD新增玩家或更新分数O(log N)ZINCRBY玩家得分 NO(log N)ZRANGE / ZREVRANGE取 Top 10 等有序范围O(log N M)ZRANK / ZREVRANK查某玩家名次O(log N)比如玩家得分只需一条ZINCRBY leaderboard_feb_2021 1 mary1934获取 Top 10 用ZREVRANGE ... 0 9查自己的名次用ZREVRANK全部由跳表保证了对数级速度。即使 2500 万次玩家数据翻倍存储约 1.3GB也足以轻松装进一台现代 Redis 集群的内存。五、核心要点总结✅跳表 有序链表 多层稀疏索引用空间换时间 ✅ 查找、插入、删除均为O(log N)无需平衡操作实现比红黑树更简单 ✅ 天然支持有序遍历与范围查询是排名类场景的理想结构 ✅ Redis 的Sorted Set Hash 表 Skip List是跳表在工业界最经典的应用 ✅ 在百万级以上用户的排行榜、好友附近、消息同步等场景中广泛使用。 延伸阅读均在项目内可对照图片学习排行榜完整设计含 API、容量估算、Redis 方案25. Real-time Gaming Leaderboard/README.md跳表命令与排名查询详解25. Real-time Gaming Leaderboard/README.md#L246-L250全书 28 章导航Readme.md【免费下载链接】system-design-notesNotes of the book System Desgin Interview - An Insiders Guide项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-notes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表