Redis 深度历险:
核心原理和应用实践
钱文品 著
声明:此文档源自钱文品老师所著《Redis 深度历险:核心原理和应用实践》,只供个人学
习所用,不得私自用于商业用途
Redis 深度历险:核心原理与应用实践 | 钱文品 著
目 录
开篇:授人以鱼不若授人以渔—— Redis 可以用来做什么? ..................................................... 7
由 Redis 面试想到的 ............................................................................................................... 7
小册的内容范围........................................................................................................................ 8
Redis 可以做什么? ................................................................................................................. 8
小结 ........................................................................................................................................... 9
扩展阅读 ................................................................................................................................... 9
基础:万丈高楼平地起 ——Redis 基础数据结构 ..................................................................... 11
Redis 安装 .............................................................................................................................. 11
Redis 基础数据结构 ............................................................................................................... 12
string (字符串) .................................................................................................................. 12
list (列表) .......................................................................................................................... 15
hash (字典)........................................................................................................................ 17
set (集合) .......................................................................................................................... 19
容器型数据结构的通用规则 .................................................................................................. 22
思考 & 作业 .......................................................................................................................... 22
扩展阅读 ................................................................................................................................. 23
应用 1:千帆竞发 —— 分布式锁.............................................................................................. 23
分布式锁 ................................................................................................................................. 24
超时问题 ................................................................................................................................. 25
可重入性 ................................................................................................................................. 26
思考题 ..................................................................................................................................... 28
应用 2:缓兵之计 —— 延时队列.............................................................................................. 29
异步消息队列 ......................................................................................................................... 29
队列空了怎么办? .................................................................................................................. 30
队列延迟 ................................................................................................................................. 31
空闲连接自动断开 .................................................................................................................. 31
锁冲突处理 ............................................................................................................................. 31
延时队列的实现...................................................................................................................... 32
进一步优化 ............................................................................................................................. 35
思考 ......................................................................................................................................... 35
应用 3:节衣缩食 —— 位图 ..................................................................................................... 35
基本使用 ................................................................................................................................. 36
统计和查找 ............................................................................................................................. 38
魔术指令 bitfield .................................................................................................................... 39
思考 & 作业 .......................................................................................................................... 42
应用 4:四两拨千斤 —— HyperLogLog .................................................................................... 42
使用方法 ................................................................................................................................. 43
pfadd 这个 pf 是什么意思? ................................................................................................ 46
pfmerge 适合什么场合用? ................................................................................................... 46
注意事项 ................................................................................................................................. 46
HyperLogLog 实现原理 ......................................................................................................... 47
第 1 页 共 226 页
Redis 深度历险:核心原理与应用实践 | 钱文品 著
pf 的内存占用为什么是 12k? ............................................................................................. 53
思考 & 作业 .......................................................................................................................... 53
扩展阅读 ................................................................................................................................. 53
应用 5:层峦叠嶂 —— 布隆过滤器 .......................................................................................... 53
布隆过滤器是什么? .............................................................................................................. 54
Redis 中的布隆过滤器 ........................................................................................................... 55
布隆过滤器基本使用 .............................................................................................................. 55
注意事项 ................................................................................................................................. 62
布隆过滤器的原理 .................................................................................................................. 62
空间占用估计 ......................................................................................................................... 63
实际元素超出时,误判率会怎样变化 ................................................................................... 64
用不上 Redis4.0 怎么办? .................................................................................................... 65
布隆过滤器的其它应用 .......................................................................................................... 65
扩展阅读 ................................................................................................................................. 66
应用 6:断尾求生 —— 简单限流.............................................................................................. 66
如何使用 Redis 来实现简单限流策略? .............................................................................. 67
解决方案 .......................................................................................................................... 67
小结 ......................................................................................................................................... 70
应用 7:一毛不拔 —— 漏斗限流.............................................................................................. 71
Redis-Cell ................................................................................................................................ 74
思考 ......................................................................................................................................... 75
拓展阅读 ................................................................................................................................. 75
应用 8:近水楼台 —— GeoHash ................................................................................................ 76
用数据库来算附近的人 .......................................................................................................... 76
GeoHash 算法......................................................................................................................... 77
Redis 的 Geo 指令基本使用 ................................................................................................. 78
小结 & 注意事项................................................................................................................... 82
应用 9:大海捞针 —— Scan ...................................................................................................... 83
scan 基础使用 ........................................................................................................................ 84
字典的结构 ............................................................................................................................. 86
scan 遍历顺序 ........................................................................................................................ 87
字典扩容 ................................................................................................................................. 87
对比扩容缩容前后的遍历顺序 .............................................................................................. 88
渐进式 rehash ......................................................................................................................... 89
更多的 scan 指令................................................................................................................... 89
大 key 扫描............................................................................................................................ 89
扩展阅读 ................................................................................................................................. 90
原理 1:鞭辟入里 —— 线程 IO 模型 ...................................................................................... 91
非阻塞 IO ............................................................................................................................... 91
事件轮询 (多路复用) ............................................................................................................. 92
指令队列 ................................................................................................................................. 94
响应队列 ................................................................................................................................. 94
定时任务 ................................................................................................................................. 94
扩展阅读 ................................................................................................................................. 95
第 2 页 共 226 页
Redis 深度历险:核心原理与应用实践 | 钱文品 著
原理 2:交头接耳 —— 通信协议.............................................................................................. 95
RESP(Redis Serialization Protocol).......................................................................................... 95
客户端 -> 服务器 .................................................................................................................. 97
服务器 -> 客户端 .................................................................................................................. 97
小结 ....................................................................................................................................... 100
扩展阅读 ............................................................................................................................... 100
原理 3:未雨绸缪 —— 持久化 ............................................................................................... 100
快照原理 ............................................................................................................................... 101
fork(多进程) .......................................................................................................................... 101
AOF 原理 ............................................................................................................................. 103
AOF 重写 ............................................................................................................................. 104
fsync ...................................................................................................................................... 104
运维 ....................................................................................................................................... 104
Redis 4.0 混合持久化 ........................................................................................................... 105
思考题 ................................................................................................................................... 105
原理 4:雷厉风行 —— 管道 ................................................................................................... 106
Redis 的消息交互................................................................................................................. 106
管道压力测试 ....................................................................................................................... 107
深入理解管道本质 ................................................................................................................ 107
小结 ....................................................................................................................................... 109
原理 5:同舟共济 —— 事务 ................................................................................................... 110
Redis 事务的基本使用 ......................................................................................................... 110
原子性 ................................................................................................................................... 111
discard(丢弃) ......................................................................................................................... 112
优化 ....................................................................................................................................... 112
Watch .................................................................................................................................... 112
思考题 ................................................................................................................................... 115
原理 6:小道消息 —— PubSub ................................................................................................ 116
消息多播 ............................................................................................................................... 116
PubSub .................................................................................................................................. 116
模式订阅 ............................................................................................................................... 119
消息结构 ............................................................................................................................... 120
PubSub 缺点 ......................................................................................................................... 120
补充 ....................................................................................................................................... 121
原理 7:开源节流 —— 小对象压缩 ........................................................................................ 122
32bit vs 64bit ......................................................................................................................... 122
小对象压缩存储 (ziplist) ...................................................................................................... 122
内存回收机制 ....................................................................................................................... 126
内存分配算法 ....................................................................................................................... 126
扩展阅读 ............................................................................................................................... 127
原理 8:有备无患 —— 主从同步............................................................................................ 127
CAP 原理 ............................................................................................................................. 127
最终一致 ............................................................................................................................... 128
主从同步 ............................................................................................................................... 128
第 3 页 共 226 页
Redis 深度历险:核心原理与应用实践 | 钱文品 著
增量同步 ............................................................................................................................... 129
快照同步 ............................................................................................................................... 129
增加从节点 ........................................................................................................................... 130
无盘复制 ............................................................................................................................... 130
Wait 指令 ............................................................................................................................. 130
小结 ....................................................................................................................................... 131
集群 1:李代桃僵 —— Sentinel ............................................................................................... 131
消息丢失 ............................................................................................................................... 133
Sentinel 基本使用................................................................................................................. 134
作业 ....................................................................................................................................... 135
集群 2:分而治之 —— Codis ................................................................................................... 136
Codis 分片原理 .................................................................................................................... 137
不同的 Codis 实例之间槽位关系如何同步? .................................................................... 138
扩容 ....................................................................................................................................... 139
自动均衡 ............................................................................................................................... 139
Codis 的代价 ........................................................................................................................ 140
Codis 的优点 ........................................................................................................................ 140
MGET 指令的操作过程 ....................................................................................................... 140
架构变迁 ............................................................................................................................... 141
Codis 的尴尬 ........................................................................................................................ 141
Codis 的后台管理 ................................................................................................................ 142
思考 & 作业 ........................................................................................................................ 143
集群 3:众志成城 —— Cluster ................................................................................................. 144
槽位定位算法 ....................................................................................................................... 145
跳转 ....................................................................................................................................... 145
迁移 ....................................................................................................................................... 146
容错 ....................................................................................................................................... 147
网络抖动 ............................................................................................................................... 148
可能下线 (PFAIL-Possibly Fail) 与确定下线 (Fail) ........................................................... 148
Cluster 基本使用 .................................................................................................................. 148
槽位迁移感知 ....................................................................................................................... 149
集群变更感知 ....................................................................................................................... 150
思考 & 作业 ........................................................................................................................ 150
拓展 1:耳听八方 —— Stream ................................................................................................. 151
消息 ID ................................................................................................................................. 152
消息内容 ............................................................................................................................... 152
增删改查 ............................................................................................................................... 152
独立消费 ............................................................................................................................... 154
创建消费组 ........................................................................................................................... 155
消费 ....................................................................................................................................... 156
Stream 消息太多怎么办? ..................................................................................................... 159
消息如果忘记 ACK 会怎样? .............................................................................................. 159
PEL 如何避免消息丢失? ..................................................................................................... 160
Stream 的高可用 .................................................................................................................. 160
第 4 页 共 226 页
Redis 深度历险:核心原理与应用实践 | 钱文品 著
分区 Partition ........................................................................................................................ 160
小结 ....................................................................................................................................... 160
拓展 2:无所不知 —— Info 指令 ............................................................................................ 162
Redis 每秒执行多少次指令? ............................................................................................. 162
Redis 连接了多少客户端? ................................................................................................. 163
Redis 内存占用多大 ? ......................................................................................................... 164
复制积压缓冲区多大? ........................................................................................................ 164
思考 ....................................................................................................................................... 165
拓展 3:拾遗漏补 —— 再谈分布式锁 .................................................................................... 166
Redlock 算法 ........................................................................................................................ 166
Redlock 使用场景 ................................................................................................................ 167
扩展阅读 ............................................................................................................................... 167
拓展 4:朝生暮死 —— 过期策略............................................................................................ 168
过期的 key 集合 .................................................................................................................. 168
定时扫描策略 ....................................................................................................................... 168
从库的过期策略.................................................................................................................... 169
拓展 5:优胜劣汰 —— LRU .................................................................................................... 170
LRU 算法 ............................................................................................................................. 170
近似 LRU 算法.................................................................................................................... 171
扩展阅读 ............................................................................................................................... 173
思考 & 作业 ........................................................................................................................ 173
拓展 6:平波缓进 —— 懒惰删除............................................................................................ 174
Redis 为什么要懒惰删除(lazy free)? ................................................................................. 174
flush ....................................................................................................................................... 174
异步队列 ............................................................................................................................... 174
AOF Sync 也很慢 .................................................................................................................. 175
更多异步删除点.................................................................................................................... 175
扩展阅读 ............................................................................................................................... 175
拓展 7:妙手仁心 —— 优雅地使用 Jedis .............................................................................. 176
重试 ....................................................................................................................................... 180
作业 ....................................................................................................................................... 180
拓展 8:居安思危 —— 保护 Redis......................................................................................... 181
指令安全 ............................................................................................................................... 181
端口安全 ............................................................................................................................... 181
Lua 脚本安全 ....................................................................................................................... 182
SSL 代理 .............................................................................................................................. 182
小结 ....................................................................................................................................... 183
拓展 9:隔墙有耳 —— Redis 安全通信 .................................................................................. 184
spiped 原理 ........................................................................................................................... 185
spiped 使用入门 ................................................................................................................... 185
作业 ....................................................................................................................................... 188
源码 1:极度深寒 —— 探索「字符串」内部结构 ................................................................. 188
embstr vs raw ......................................................................................................................... 190
扩容策略 ............................................................................................................................... 192
第 5 页 共 226 页
Redis 深度历险:核心原理与应用实践 | 钱文品 著
思考 ....................................................................................................................................... 192
源码 2:极度深寒 —— 探索「字典」内部 ............................................................................ 192
dict 内部结构 ....................................................................................................................... 193
渐进式 rehash ........................................................................................................................ 194
查找过程 ............................................................................................................................... 195
hash 函数 .............................................................................................................................. 196
hash 攻击 .............................................................................................................................. 196
扩容条件 ............................................................................................................................... 196
缩容条件 ............................................................................................................................... 197
set 的结构 ............................................................................................................................. 197
思考 ....................................................................................................................................... 197
源码 3:极度深寒 —— 探索「压缩列表」内部 .................................................................... 198
增加元素 ............................................................................................................................... 200
级联更新 ............................................................................................................................... 201
IntSet 小整数集合 ................................................................................................................ 203
思考 ....................................................................................................................................... 204
源码 4:极度深寒 —— 探索「快速列表」内部 .................................................................... 204
每个 ziplist 存多少元素? .................................................................................................. 206
压缩深度 ............................................................................................................................... 206
扩展阅读 ............................................................................................................................... 207
源码 5:极度深寒 —— 探索「跳跃列表」内部结构 ............................................................. 207
基本结构 ............................................................................................................................... 208
查找过程 ............................................................................................................................... 209
随机层数 ............................................................................................................................... 209
插入过程 ............................................................................................................................... 210
删除过程 ............................................................................................................................... 212
更新过程 ............................................................................................................................... 212
如果 score 值都一样呢? .................................................................................................... 213
元素排名是怎么算出来的? ................................................................................................ 213
思考 ....................................................................................................................................... 213
后记 ....................................................................................................................................... 214
源码 6:极度深寒 —— 探索「紧凑列表」内部 .................................................................... 214
级联更新 ............................................................................................................................... 217
取代 ziplist ........................................................................................................................... 217
思考 ....................................................................................................................................... 217
源码 7:极度深寒 —— 探索「基数树」内部 ........................................................................ 218
应用 ....................................................................................................................................... 218
结构 ....................................................................................................................................... 221
增删节点 ............................................................................................................................... 223
思考 ....................................................................................................................................... 223
尾声:百尺竿头 —— 继续深造指南 ........................................................................................ 223
参考资料 ............................................................................................................................... 223
第 6 页 共 226 页
Redis 深度历险:核心原理与应用实践 | 钱文品 著
开篇:授人以鱼不若授人以渔—— Redis 可以用来做什么?
Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary
Service」的首字母缩写,也就是「远程字典服务」。Redis 以其超高的性能、完美的文档、
简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。国内外很多大型互联网
公司都在使用 Redis,比如 Twitter、YouPorn、暴雪娱乐、Github、StackOverflow、腾讯、
阿里、京东、华为、新浪微博等等,很多中小型公司也都有应用。也可以说,对 Redis 的了
解和应用实践已成为当下中高级后端开发者绕不开的必备技能。
由 Redis 面试想到的
在面试后端工程师 Redis 技能的时候,面试官通常问的第一个问题就是“Redis 能用来做
什么?”,第一个回答往往都会是「缓存」。缓存确实是 Redis 使用最多的领域,它相比
Memcache 而言更加易于理解、使用和控制。
可是如果再进一步问“还有呢?”,大多数同学就会开始皱眉头,只有一小部分人会回答
「分布式锁」。如果你就分布式锁再深入问下去,他们基本就会开始摇头:我们项目里面
Redis 的锁方法都是别人(应该是架构师)封装好的,拿过来直接使用,内部细节没有去了
解过,也没有必要了解。
对类似的场景,我深有体会。因为关于 Redis 的面试题,之前准备了很多,但是真正能
用上的却很少。当面试的同学频繁地回复「不知道、没用过」的时候,再继续深入追问已经
毫无意义,这时候就需要切换话题了。偶尔遇上几个能持续很多回合的同学,他们总能使人
眼前一亮。如果再拓展一下周边知识点,就会发现这些人往往也会有所涉猎,这时我在心中
已经暗暗地对这位同学伸出了大拇指。
这样的面试经历事后也让我深刻反思:架构师的技能很高,对提升团队研发效率很有帮
助,我们非常钦佩和羡慕。但是普通开发者如果习惯于在架构师封装好的东西之上,只专注
于做业务开发,那久而久之,在技术理解和成长上就会变得迟钝甚至麻木。从这个角度看,
架构师也可能成为普通开发者的“敌人”,他的强大能力会让大家变成“温室的花朵”,一旦遇
到环境变化就会不知所措。
其实很多业务场景,如果仅仅是会使用某项技术、框架,那是再简单不过了。但随着业
务发展,系统的用户量、并发量涨上来之后,现有系统的问题就会层出不穷地暴露出来。如
第 7 页 共 226 页