信息技术大学
Redis 数据结构
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
信息技术大学
Redis 数据结构
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
五大类型与底层结构
String/List/Hash/Set/ZSet 五大类型,底层映射到 SDS、跳表、压缩列表等结构。
String
SDS 动态字符串,缓存与计数器皆用它
List/Hash
quicklist 双向链表串起 ziplist 小节点
Set
整数集合或哈希表,交并差集随身携带
ZSet
跳表加哈希双结构,排名与范围双修
单线程模型为何快
内存操作 + 单线程免锁 + IO 多路复用:快不在多,而在没有浪费。
内存级
数据全在内存,单次操作纳秒级
免锁
单线程无竞态,无上下文切换开销
epoll
IO 多路复用,一线程看护上万连接
跳表与压缩列表
ZSet 的两条腿:跳表管范围与排名,压缩列表管小数据的省内存。
跳表
多层有序链表,查找近似二分,实现简单
压缩列表
连续内存存小量数据,省指针省内存
转换阈值
元素数量或长度超限,自动升级标准结构
Bitmap/HyperLogLog 场景
位与基数的极限压缩:Bitmap 记签到,HLL 一亿 UV 只要十几 KB。
Bitmap
一位一状态,签到、在线、布隆的底座
HyperLogLog
概率计数,误差 0.81%,内存固定 12KB
选型
要精确用 Set,能容忍误差用 HLL
本节要点
- ✓五大类型背后是多种底层结构
- ✓快 = 内存 + 单线程免锁 + epoll
- ✓跳表管范围排名,ziplist 省内存
- ✓Bitmap 记状态,HLL 估基数
延伸主题:用 Bitmap 写个签到实测 HLL 的误差
课后思考
先自己回答,再展开参考答案——能讲出来才算真懂。
1Redis 6.0 引入多线程,为什么命令执行仍是单线程?
参考答案多线程只用于网络读写与协议解析,命令执行保持单线程:既保住免锁与原子语义的简单性,又解决了网络 IO 这个新瓶颈。慢的从来不是计算,改的只是 IO。
2ZSet 为什么用跳表而不是红黑树?
参考答案跳表实现简单,范围查询天然沿链表走,还能按排名定位;红黑树旋转复杂、范围要中序遍历。性能相近时,可维护性决定选型。
3HLL 有误差,什么场景敢用?
参考答案UV、曝光这类统计天然允许少量误差,业务只看趋势;0.81% 的固定误差换来内存从 GB 降到 KB。要精确去重的场景(如抽奖判重)必须换 Set。