第1章 引言 1
1.1 Redis简介 1
1.2 Redis 5.0的新特性 2
1.3 Redis源码概述 3
1.4 Redis安装与调试 4
1.5 本章小结 6
第2章 简单动态字符串 7
2.1 数据结构 7
2.2 基本操作 11
2.2.1 创建字符串 11
2.2.2 释放字符串 12
2.2.3 拼接字符串 12
2.2.4 其余API 15
2.3 本章小结 15
第3章 跳跃表 17
3.1 简介 17
3.2 跳跃表节点与结构 19
3.2.1 跳跃表节点 19
3.2.2 跳跃表结构 20
3.3 基本操作 20
3.3.1 创建跳跃表 21
3.3.2 插入节点 22
3.3.3 删除节点 28
3.3.4 删除跳跃表 30
3.4 跳跃表的应用 31
3.5 本章小结 32
第4章 压缩列表 33
4.1 压缩列表的存储结构 33
4.2 结构体 35
4.3 基本操作 37
4.3.1 创建压缩列表 37
4.3.2 插入元素 38
4.3.3 删除元素 42
4.3.4 遍历压缩列表 44
4.4 连锁更新 44
4.5 本章小结 45
第5章 字典 47
5.1 基本概念 47
5.1.1 数组 48
5.1.2 Hash函数 49
5.1.3 Hash冲突 51
5.2 Redis字典的实现 52
5.3 基本操作 55
5.3.1 字典初始化 55
5.3.2 添加元素 56
5.3.3 查找元素 60
5.3.4 修改元素 61
5.3.5 删除元素 61
5.4 字典的遍历 62
5.4.1 迭代器遍历 62
5.4.2 间断遍历 65
5.5 API列表 70
5.6 本章小结 71
第6章 整数集合 72
6.1 数据存储 72
6.2 基本操作 75
6.2.1 查询元素 75
6.2.2 添加元素 78
6.2.3 删除元素 82
6.2.4 常用API 83
6.3 本章小结 85
第7章 quicklist的实现 86
7.1 quicklist简介 86
7.2 数据存储 87
7.3 数据压缩 91
7.3.1 压缩 92
7.3.2 解压缩 93
7.4 基本操作 94
7.4.1 初始化 94
7.4.2 添加元素 95
7.4.3 删除元素 96
7.4.4 更改元素 98
7.4.5 查找元素 99
7.4.6 常用API 100
7.5 本章小结 101
第8章 Stream 102
8.1 Stream简介 102
8.1.1 Stream底层结构listpack 103
8.1.2 Stream底层结构Rax简介 104
8.1.3 Stream结构 108
8.2 Stream底层结构listpack的实现 112
8.2.1 初始化 112
8.2.2 增删改操作 112
8.2.3 遍历操作 113
8.2.4 读取元素 113
8.3 Stream底层结构Rax的实现 114
8.3.1 初始化 114
8.3.2 查找元素 114
8.3.3 添加元素 116
8.3.4 删除元素 118
8.3.5 遍历元素 120
8.4 Stream结构的实现 123
8.4.1 初始化 124
8.4.2 添加元素 124
8.4.3 删除元素 125
8.4.4 查找元素 128
8.4.5 遍历 129
8.5 本章小结 131
第9章 命令处理生命周期 132
9.1 基本知识 132
9.1.1 对象结构体robj 132
9.1.2 客户端结构体client 136
9.1.3 服务端结构体redisServer 138
9.1.4 命令结构体redisCommand 139
9.1.5 事件处理 141
9.2 server启动过程 149
9.2.1 server初始化 149
9.2.2 启动监听 152
9.3 命令处理过程 155
9.3.1 命令解析 156
9.3.2 命令调用 159
9.3.3 返回结果 161
9.4 本章小结 163
第10章 键相关命令的实现 164
10.1 对象结构体和数据库结构体回顾 164
10.1.1 对象结构体redisObject 164
10.1.2 数据库结构体redisDb 166
10.2 查看键信息 166
10.2.1 查看键属性 166
10.2.2 查看键类型 169
10.2.3 查看键过期时间 170
10.3 设置键信息 171
10.3.1 设置键过期时间 171
10.3.2 删除键过期时间 172
10.3.3 重命名键 173
10.3.4 修改键最后访问 173
10.4 查找键 174
10.4.1 判断键是否存在 174
10.4.2 查找符合模式的键 175
10.4.3 遍历键 176
10.4.4 随机取键 177
10.5 操作键 178
10.5.1 删除键 178
10.5.2 序列化/反序列化键 182
10.5.3 移动键 183
10.5.4 键排序 185
10.6 本章小结 187
第11章 字符串相关命令的实现 188
11.1 相关命令介绍 188
11.2 设置字符串 189
11.2.1 set命令 189
11.2.2 mset命令 195
11.3 修改字符串 196
11.3.1 append命令 196
11.3.2 setrange命令 197
11.3.3 计数器命令 197
11.4 字符串获取 199
11.4.1 get命令 199
11.4.2 getset命令 199
11.4.3 getrange命令 199
11.4.4 strlen命令 200
11.4.5 mget命令 201
11.5 字符串位操作 201
11.5.1 setbit命令 201
11.5.2 getbit命令 203
11.5.3 bitpos命令 203
11.5.4 bitcount命令 205
11.5.5 bitop命令 208
11.5.6 bitfield命令 209
11.6 本章小结 212
第12章 散列表相关命令的实现 213
12.1 简介 213
12.1.1 底层存储 213
12.1.2 底层存储转换 215
12.1.3 接口说明 215
12.2 设置命令 216
12.3 读取命令 217
12.3.1 hexists命令 218
12.3.2 hget/hmget命令 218
12.3.3 hkeys/hvals/hgetall命令 219
12.3.4 hlen命令 220
12.3.5 hscan命令 220
12.4 删除命令 221
12.5 自增命令 222
12.6 本章小结 224
第13章 列表相关命令的实现 225
13.1 相关命令介绍 225
13.1.1 命令列表 225
13.1.2 栈和队列命令列表 226
13.2 push/pop相关命令 228
13.2.1 push类命令的实现 228
13.2.2 pop类命令的实现 229
13.2.3 阻塞push/pop类命令的实现 230
13.3 获取列表数据 234
13.3.1 获取单个元素 234
13.3.2 获取多个元素 235
13.3.3 获取列表长度 236
13.4 操作列表 236
13.4.1 设置元素 237
13.4.2 插入元素 237
13.4.3 删除元素 238
13.4.4 裁剪列表 239
13.5 本章小结 240
第14章 集合相关命令的实现 241
14.1 相关命令介绍 241
14.2 集合运算 254
14.2.1 交集 254
14.2.2 并集 258
14.2.3 差集 260
14.3 本章小结 263
第15章 有序集合相关命令的实现 264
15.1 相关命令介绍 264
15.2 基本操作 272
15.2.1 添加成员 272
15.2.2 删除成员 275
15.2.3 基数统计 276
15.2.4 数量计算 277
15.2.5 计数器 279
15.2.6 获取排名 279
15.2.7 获取分值 279
15.2.8 遍历 280
15.3 批量操作 280
15.3.1 范围查找 280
15.3.2 范围删除 283
15.4 集合运算 284
15.5 本章小结 284
第16章 GEO相关命令 285
16.1 基础知识 285
16.2 命令实现 288
16.2.1 使用geoadd添加坐标 288
16.2.2 计算坐标的geohash 291
16.2.3 使用geopos查询位置经纬度 292
16.2.4 使用geodist计算两点距离 295
16.2.5 使用georadius/georadius-bymembe查询范围内元素 295
16.3 本章小结 297
第17章 HyperLogLog相关命令的实现 298
17.1 基本原理 298
17.1.1 算法演进 299
17.1.2 线性计数算法 299
17.1.3 对数计数算法 300
17.1.4 自适应计数算法 302
17.1.5 超对数计数算法 302
17.2 HLL Redis实现 302
17.2.1 HLL头对象 303
17.2.2 稀疏编码 304
17.2.3 密集编码 306
17.2.4 内部编码 308
17.2.5 编码转换 309
17.3 命令实现 310
17.3.1 添加基数 310
17.3.2 近似基数 311
17.3.3 合并基数 313
17.4 本章小结 314
第18章 数据流相关命令的实现 315
18.1 相关命令介绍 315
18.2 基本操作命令原理分析 323
18.2.1 添加消息 323
18.2.2 删除消息 325
18.2.3 范围查找 326
18.2.4 获取队列信息 327
18.2.5 长度统计 327
18.2.6 剪切消息 328
18.3 分组命令原理分析 328
18.3.1 分组管理 328
18.3.2 消费消息 330
18.3.3 响应消息 331
18.3.4 获取未响应消息列表 331
18.3.5 修改指定未响应消息归属 331
18.4 本章小结 332
第19章 其他命令 333
19.1 事务 333
19.1.1 事务简介 333
19.1.2 事务命令实现 334
19.2 发布-订阅命令实现 339
19.3 Lua脚本 345
19.3.1 初始化Lua环境 345
19.3.2 在Lua中调用Redis命令 347
19.3.3 Redis和Lua数据类型转换 349
19.3.4 命令实现 351
19.4 本章小结 356
第20章 持久化 357
20.1 RDB 358
20.1.1 RDB执行流程 358
20.1.2 RDB文件结构 359
20.2 AOF 367
20.2.1 AOF执行流程 368
20.2.2 AOF重写 369
20.3 RDB与AOF相关配置指令 372
20.4 本章小结 374
第21章 主从复制 375
21.1 主从复制功能实现 375
21.2 主从复制源码基础 378
21.3 slaver源码分析 382
21.4 master源码分析 388
21.5 本章小结 391
第22章 哨兵和集群 392
22.1 哨兵 392
22.1.1 哨兵简介 393
22.1.2 代码流程 394
22.1.3 主从切换 396
22.1.4 常用命令 399
22.2 集群 400
22.2.1 集群简介 401
22.2.2 代码流程 402
22.2.3 主从切换 404
22.2.4 副本漂移 406
22.2.5 分片迁移 407
22.2.6 通信数据包类型 409
22.3 本章小结 415