logo资料库

redis深度历险.pdf

第1页 / 共226页
第2页 / 共226页
第3页 / 共226页
第4页 / 共226页
第5页 / 共226页
第6页 / 共226页
第7页 / 共226页
第8页 / 共226页
资料共226页,剩余部分请下载后查看
开篇:授人以鱼不若授人以渔—— Redis 可以用来做什么?
由 Redis 面试想到的
小册的内容范围
Redis 可以做什么?
小结
扩展阅读
基础:万丈高楼平地起 ——Redis 基础数据结构
Redis 安装
Redis 基础数据结构
string (字符串)
list (列表)
hash (字典)
set (集合)
容器型数据结构的通用规则
思考 & 作业
扩展阅读
应用 1:千帆竞发 —— 分布式锁
分布式锁
超时问题
可重入性
思考题
应用 2:缓兵之计 —— 延时队列
异步消息队列
队列空了怎么办?
队列延迟
空闲连接自动断开
锁冲突处理
延时队列的实现
进一步优化
思考
应用 3:节衣缩食 —— 位图
基本使用
统计和查找
魔术指令 bitfield
思考 & 作业
应用 4:四两拨千斤 —— HyperLogLog
使用方法
pfadd 这个 pf 是什么意思?
pfmerge 适合什么场合用?
注意事项
HyperLogLog 实现原理
pf 的内存占用为什么是 12k?
思考 & 作业
扩展阅读
应用 5:层峦叠嶂 —— 布隆过滤器
布隆过滤器是什么?
Redis 中的布隆过滤器
布隆过滤器基本使用
注意事项
布隆过滤器的原理
空间占用估计
实际元素超出时,误判率会怎样变化
用不上 Redis4.0 怎么办?
布隆过滤器的其它应用
扩展阅读
应用 6:断尾求生 —— 简单限流
如何使用 Redis 来实现简单限流策略?
解决方案
小结
应用 7:一毛不拔 —— 漏斗限流
Redis-Cell
思考
拓展阅读
应用 8:近水楼台 —— GeoHash
用数据库来算附近的人
GeoHash 算法
Redis 的 Geo 指令基本使用
小结 & 注意事项
应用 9:大海捞针 —— Scan
scan 基础使用
字典的结构
scan 遍历顺序
字典扩容
对比扩容缩容前后的遍历顺序
渐进式 rehash
更多的 scan 指令
大 key 扫描
扩展阅读
原理 1:鞭辟入里 —— 线程 IO 模型
非阻塞 IO
事件轮询 (多路复用)
指令队列
响应队列
定时任务
扩展阅读
原理 2:交头接耳 —— 通信协议
RESP(Redis Serialization Protocol)
客户端 -> 服务器
服务器 -> 客户端
小结
扩展阅读
原理 3:未雨绸缪 —— 持久化
快照原理
fork(多进程)
AOF 原理
AOF 重写
fsync
运维
Redis 4.0 混合持久化
思考题
原理 4:雷厉风行 —— 管道
Redis 的消息交互
管道压力测试
深入理解管道本质
小结
原理 5:同舟共济 —— 事务
Redis 事务的基本使用
原子性
discard(丢弃)
优化
Watch
思考题
原理 6:小道消息 —— PubSub
消息多播
PubSub
模式订阅
消息结构
PubSub 缺点
补充
原理 7:开源节流 —— 小对象压缩
32bit vs 64bit
小对象压缩存储 (ziplist)
内存回收机制
内存分配算法
扩展阅读
原理 8:有备无患 —— 主从同步
CAP 原理
最终一致
主从同步
增量同步
快照同步
增加从节点
无盘复制
Wait 指令
小结
集群 1:李代桃僵 —— Sentinel
消息丢失
Sentinel 基本使用
作业
集群 2:分而治之 —— Codis
Codis 分片原理
不同的 Codis 实例之间槽位关系如何同步?
扩容
自动均衡
Codis 的代价
Codis 的优点
MGET 指令的操作过程
架构变迁
Codis 的尴尬
Codis 的后台管理
思考 & 作业
集群 3:众志成城 —— Cluster
槽位定位算法
跳转
迁移
容错
网络抖动
可能下线 (PFAIL-Possibly Fail) 与确定下线 (Fail)
Cluster 基本使用
槽位迁移感知
集群变更感知
思考 & 作业
拓展 1:耳听八方 —— Stream
消息 ID
消息内容
增删改查
独立消费
创建消费组
消费
Stream 消息太多怎么办?
消息如果忘记 ACK 会怎样?
PEL 如何避免消息丢失?
Stream 的高可用
分区 Partition
小结
拓展 2:无所不知 —— Info 指令
Redis 每秒执行多少次指令?
Redis 连接了多少客户端?
Redis 内存占用多大 ?
复制积压缓冲区多大?
思考
拓展 3:拾遗漏补 —— 再谈分布式锁
Redlock 算法
Redlock 使用场景
扩展阅读
拓展 4:朝生暮死 —— 过期策略
过期的 key 集合
定时扫描策略
从库的过期策略
拓展 5:优胜劣汰 —— LRU
LRU 算法
近似 LRU 算法
扩展阅读
思考 & 作业
拓展 6:平波缓进 —— 懒惰删除
Redis 为什么要懒惰删除(lazy free)?
flush
异步队列
AOF Sync也很慢
更多异步删除点
扩展阅读
拓展 7:妙手仁心 —— 优雅地使用 Jedis
重试
作业
拓展 8:居安思危 —— 保护 Redis
指令安全
端口安全
Lua 脚本安全
SSL 代理
小结
拓展 9:隔墙有耳 —— Redis 安全通信
spiped 原理
spiped 使用入门
作业
源码 1:极度深寒 —— 探索「字符串」内部结构
embstr vs raw
扩容策略
思考
源码 2:极度深寒 —— 探索「字典」内部
dict 内部结构
渐进式rehash
查找过程
hash 函数
hash 攻击
扩容条件
缩容条件
set 的结构
思考
源码 3:极度深寒 —— 探索「压缩列表」内部
增加元素
级联更新
IntSet 小整数集合
思考
源码 4:极度深寒 —— 探索「快速列表」内部
每个 ziplist 存多少元素?
压缩深度
扩展阅读
源码 5:极度深寒 —— 探索「跳跃列表」内部结构
基本结构
查找过程
随机层数
插入过程
删除过程
更新过程
如果 score 值都一样呢?
元素排名是怎么算出来的?
思考
后记
源码 6:极度深寒 —— 探索「紧凑列表」内部
级联更新
取代 ziplist
思考
源码 7:极度深寒 —— 探索「基数树」内部
应用
结构
增删节点
思考
尾声:百尺竿头 —— 继续深造指南
参考资料
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 页
分享到:
收藏