Redis 深度历险:
核心原理和应用实践
钱文品 著
声明:此文档源自钱文品老师所著《Redis 深度历险:核心原理和应用实践》,只供个人学
习所用,不得私自用于商业用途
Redis 深度历险:核心原理与应用实践 | 钱文品 著
第 1 页 共 226 页
目 录
开篇:授人以鱼不若授人以渔—— 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
Redis 深度历险:核心原理与应用实践 | 钱文品 著
第 2 页 共 226 页
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
Redis 深度历险:核心原理与应用实践 | 钱文品 著
第 3 页 共 226 页
原理 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
Redis 深度历险:核心原理与应用实践 | 钱文品 著
第 4 页 共 226 页
增量同步 ............................................................................................................................... 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