Redis 数据结构

官官方信息技术老师·7 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

Redis 数据结构

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

按 空格/→ 演示下一步

问一句
1 / 7 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

Redis 数据结构

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

1第 1 页 · Redis 数据结构

五大类型与底层结构

String/List/Hash/Set/ZSet 五大类型,底层映射到 SDS、跳表、压缩列表等结构。

String
SDS 动态字符串,缓存与计数器皆用它
List/Hash
quicklist 双向链表串起 ziplist 小节点
Set
整数集合或哈希表,交并差集随身携带
ZSet
跳表加哈希双结构,排名与范围双修
2第 2 页 · 五大类型与底层结构

单线程模型为何快

内存操作 + 单线程免锁 + IO 多路复用:快不在多,而在没有浪费。

内存级
数据全在内存,单次操作纳秒级
免锁
单线程无竞态,无上下文切换开销
epoll
IO 多路复用,一线程看护上万连接
3第 3 页 · 单线程模型为何快

跳表与压缩列表

ZSet 的两条腿:跳表管范围与排名,压缩列表管小数据的省内存。

跳表
多层有序链表,查找近似二分,实现简单
压缩列表
连续内存存小量数据,省指针省内存
转换阈值
元素数量或长度超限,自动升级标准结构
4第 4 页 · 跳表与压缩列表

Bitmap/HyperLogLog 场景

位与基数的极限压缩:Bitmap 记签到,HLL 一亿 UV 只要十几 KB。

Bitmap
一位一状态,签到、在线、布隆的底座
HyperLogLog
概率计数,误差 0.81%,内存固定 12KB
选型
要精确用 Set,能容忍误差用 HLL
5第 5 页 · Bitmap/HyperLogLog 场景

本节要点

  • ✓五大类型背后是多种底层结构
  • ✓快 = 内存 + 单线程免锁 + epoll
  • ✓跳表管范围排名,ziplist 省内存
  • ✓Bitmap 记状态,HLL 估基数
延伸主题:用 Bitmap 写个签到实测 HLL 的误差
6第 6 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1Redis 6.0 引入多线程,为什么命令执行仍是单线程?

参考答案多线程只用于网络读写与协议解析,命令执行保持单线程:既保住免锁与原子语义的简单性,又解决了网络 IO 这个新瓶颈。慢的从来不是计算,改的只是 IO。

2ZSet 为什么用跳表而不是红黑树?

参考答案跳表实现简单,范围查询天然沿链表走,还能按排名定位;红黑树旋转复杂、范围要中序遍历。性能相近时,可维护性决定选型。

3HLL 有误差,什么场景敢用?

参考答案UV、曝光这类统计天然允许少量误差,业务只看趋势;0.81% 的固定误差换来内存从 GB 降到 KB。要精确去重的场景(如抽奖判重)必须换 Set。

7第 7 页 · 课后思考
Redis 数据结构 · 知识图解