基本信息
源码名称:Redis设计与实现.pdf
源码大小:1.32M
文件格式:.pdf
开发语言:Java
更新时间:2020-07-02
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
Contents 1 第一部分:内部数据结构 3 1.1 简单动态字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.1 sds 的用途 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.2 Redis 中的字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.3 优化追加操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.1.4 sds 模块的 API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2 双端链表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2.1 双端链表的应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.2 双端链表的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.2.3 迭代器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2.4 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3 字典 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3.1 字典的应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3.2 字典的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.3.3 创建新字典 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.3.4 添加键值对到字典 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.3.5 添加新元素到空白字典 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.3.6 添加新键值对时发生碰撞处理 . . . . . . . . . . . . . . . . . . . . . . . . 21 1.3.7 添加新键值对时触发了 rehash 操作 . . . . . . . . . . . . . . . . . . . . . 22 1.3.8 Rehash 执行过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.3.9 渐进式 rehash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.3.10 字典的收缩 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 1.3.11 字典其他操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.3.12 字典的迭代 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.3.13 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 1.4 跳跃表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 1.4.1 跳跃表的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1.4.2 跳跃表的应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 1.4.3 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2 第二部分:内存映射数据结构 37 2.1 整数集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.1.1 整数集合的应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.1.2 数据结构和主要操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.1.3 intset 运行实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.1.4 升级 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.1.5 关于升级 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 i 2.1.6 关于元素移动 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.1.7 其他操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.1.8 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.2 压缩列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.2.1 ziplist 的构成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 2.2.2 节点的构成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.2.3 创建新 ziplist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.2.4 将节点添加到末端 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.2.5 将节点添加到某个/某些节点的前面 . . . . . . . . . . . . . . . . . . . . . 52 2.2.6 删除节点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.2.7 遍历 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.2.8 查找元素、根据值定位节点 . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.2.9 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3 第三部分:Redis 数据类型 57 3.1 对象处理机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.1.1 redisObject 数据结构,以及 Redis 的数据类型 . . . . . . . . . . . . . . 58 3.1.2 命令的类型检查和多态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.1.3 对象共享 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.1.4 引用计数以及对象的销毁 . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.1.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 3.2 字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 3.2.1 字符串编码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 3.2.2 编码的选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.2.3 字符串命令的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.3 哈希表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.3.1 字典编码的哈希表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.3.2 压缩列表编码的哈希表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.3.3 编码的选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.3.4 哈希命令的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.4 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.4.1 编码的选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.4.2 列表命令的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.4.3 阻塞的条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.4.4 阻塞 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.4.5 阻塞因 LPUSH 、RPUSH 、LINSERT 等添加命令而被取消 . . . . . . . 69 3.4.6 先阻塞先服务(FBFS)策略 . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.4.7 阻塞因超过最大等待时间而被取消 . . . . . . . . . . . . . . . . . . . . . 73 3.5 集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 3.5.1 编码的选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3.5.2 编码的切换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3.5.3 字典编码的集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3.5.4 集合命令的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.5.5 求交集算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.5.6 求并集算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.5.7 求差集算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.6 有序集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.6.1 编码的选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.6.2 编码的转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.6.3 ZIPLIST 编码的有序集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.6.4 SKIPLIST 编码的有序集 . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 ii 4 第四部分:功能的实现 81 4.1 事务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.1.1 事务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.1.2 开始事务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.1.3 命令入队 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.1.4 执行事务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.1.5 在事务和非事务状态下执行命令 . . . . . . . . . . . . . . . . . . . . . . . 86 4.1.6 事务状态下的 DISCARD 、MULTI 和 WATCH 命令 . . . . . . . . . . . 86 4.1.7 带 WATCH 的事务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.1.8 WATCH 命令的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.1.9 WATCH 的触发 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.1.10 事务的 ACID 性质 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.1.11 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.2 订阅与发布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.2.1 频道的订阅与信息发送 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.2.2 订阅频道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.2.3 发送信息到频道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 4.2.4 退订频道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.2.5 模式的订阅与信息发送 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.2.6 订阅模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4.2.7 发送信息到模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 4.2.8 退订模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 4.2.9 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 4.3 Lua 脚本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 4.3.1 初始化 Lua 环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 4.3.2 脚本的安全性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 4.3.3 脚本的执行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 4.3.4 EVAL 命令的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.3.5 EVALSHA 命令的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 4.3.6 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4.4 慢查询日志 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4.4.1 相关数据结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 4.4.2 慢查询日志的记录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 4.4.3 慢查询日志的操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 4.4.4 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 5 第五部分:内部运作机制 109 5.1 数据库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 5.1.1 数据库的结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 5.1.2 数据库的切换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 5.1.3 数据库键空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 5.1.4 键空间的操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 5.1.5 键的过期时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 5.1.6 过期时间的保存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 5.1.7 设置生存时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 5.1.8 过期键的判定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 5.1.9 过期键的清除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 5.1.10 过期键的惰性删除策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5.1.11 过期键的定期删除策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 5.1.12 过期键对 AOF 、RDB 和复制的影响 . . . . . . . . . . . . . . . . . . . . 122 5.1.13 数据库空间的收缩和扩展 . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 iii 5.1.14 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 5.2 RDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 5.2.1 保存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 5.2.2 SAVE 、BGSAVE 、AOF 写入和 BGREWRITEAOF . . . . . . . . . . 126 5.2.3 载入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 5.2.4 RDB 文件结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 5.2.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.3 AOF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.3.1 AOF 命令同步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 5.3.2 命令传播 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 5.3.3 缓存追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 5.3.4 文件写入和保存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 5.3.5 AOF 保存模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 5.3.6 AOF 保存模式对性能和安全性的影响 . . . . . . . . . . . . . . . . . . . . 138 5.3.7 AOF 文件的读取和数据还原 . . . . . . . . . . . . . . . . . . . . . . . . . 139 5.3.8 AOF 重写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 5.3.9 AOF 重写的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 5.3.10 AOF 后台重写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 5.3.11 AOF 后台重写的触发条件 . . . . . . . . . . . . . . . . . . . . . . . . . . 144 5.3.12 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 5.4 事件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 5.4.1 文件事件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 5.4.2 时间事件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 5.4.3 时间事件应用实例:服务器常规操作 . . . . . . . . . . . . . . . . . . . . 150 5.4.4 事件的执行与调度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 5.4.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 5.5 服务器与客户端 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 5.5.1 初始化服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 5.5.2 客户端连接到服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 5.5.3 命令的请求、处理和结果返回 . . . . . . . . . . . . . . . . . . . . . . . . 158 5.5.4 命令请求实例:SET 的执行过程 . . . . . . . . . . . . . . . . . . . . . . 158 5.5.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 6 关于 161 7 通过捐款支持本书 163