Redis 开发与运维

Redis 开发与运维
编辑推荐
从开发、运维两个角度总结了 Redis 实战经验,深入浅出地剖析底层实现,包含大规模集群开发与运维的实际案例、应用技巧。
全面覆盖 Redis 3 及以上版本的基本功能及应用,提供了大量手绘版图片,细腻讲解底层实现机制
内容简介
本书全面讲解 Redis 基本功能及其应用,并结合线上开发与运维监控中的实际使用案例,深入分析并总结了实际开发运维中遇到的“陷阱”,以及背后的原因, 包含大规模集群开发与管理的场景、应用案例与开发技巧,为高效开发运维提供了大量实际经验和建议。本书不要求读者有任何 Redis 使用经验对入门与进阶 DevOps 的开发者提供有价值的帮助。主要内容包括:Redis 的安装配置、API、各种高效功能、客户端、持久化、复制、高可用、内存、哨兵、集群、缓存设计等,Redis 高可用集群解决方案,Redis 设计和使用中的问题,最后提供了一个开源工具:Redis 监控运维云平台 CacheCloud。
作者简介
付磊 搜狐视频高级研发工程师,CacheCloud 项目联合创始人。拥有多年 Redis 开发运维经验,为公司多个核心业务提供 Redis 服务,同时热衷于技术传播和分享,撰写了大量关于 Redis 开发运维的技术文章。微博号 carlosfl,博客地址是 http://carlosfu.iteye.com。
张益军 搜狐视频资深研发工程师,CacheCloud 项目联合创始人,曾就职于美团、阿里巴巴等公司。搜狐视频投放组负责人,目前从事投放平台、反作弊等系统的架构设计和优化工作。研究兴趣包括海量峰值访问、分布式存储等。微博号益军 YJ, 博客地址是 http://hot66hot.iteye.com。
目录
-
序 言
-
前 言
-
致 谢
第 1 章 初识 Redis 1
-
1.1 盛赞 Redis 1
-
1.2 Redis 特性 2
-
1.3 Redis 使用场景 5
-
1.3.1 Redis 可以做什么 5
-
1.3.2 Redis 不可以做什么 5
-
1.4 用好 Redis 的建议 6
-
1.5 正确安装并启动 Redis 6
-
1.5.1 安装 Redis 7
-
1.5.2 配置、启动、操作、关闭 Redis 8
-
1.6 Redis 重大版本 11
-
1.7 本章重点回顾 14
第 2 章 API 的理解和使用 15
-
2.1 预备 15
-
2.1.1 全局命令 15
-
2.1.2 数据结构和内部编码 18
-
2.1.3 单线程架构 19
-
2.2 字符串 21
-
2.2.1 命令 22
-
2.2.2 内部编码 27
-
2.2.3 典型使用场景 28
-
2.3 哈希 31
-
2.3.1 命令 32
-
2.3.2 内部编码 35
-
2.3.3 使用场景 36
-
2.4 列表 38
-
2.4.1 命令 38
-
2.4.2 内部编码 43
-
2.4.3 使用场景 44
-
2.5 集合 46
-
2.5.1 命令 46
-
2.5.2 内部编码 50
-
2.5.3 使用场景 51
-
2.6 有序集合 52
-
2.6.1 命令 53
-
2.6.2 内部编码 59
-
2.6.3 使用场景 59
-
2.7 键管理 60
-
2.7.1 单个键管理 60
-
2.7.2 遍历键 67
-
2.7.3 数据库管理 70
-
2.8 本章重点回顾 73
第 3 章 小功能大用处 74
-
3.1 慢查询分析 74
-
3.1.1 慢查询的两个配置参数 75
-
3.1.2 最佳实践 77
-
3.2 Redis Shell 78
-
3.2.1 redis-cli 详解 78
-
3.2.2 redis-server 详解 82
-
3.2.3 redis-benchmark 详解 83
-
3.3 Pipeline 84
-
3.3.1 Pipeline 概念 84
-
3.3.2 性能测试 85
-
3.3.3 原生批量命令与 Pipeline 对比 86
-
3.3.4 最佳实践 87
-
3.4 事务与 Lua 87
-
3.4.1 事务 87
-
3.4.2 Lua 用法简述 90
-
3.4.3 Redis 与 Lua 92
-
3.4.4 案例 94
-
3.4.5 Redis 如何管理 Lua 脚本 96
-
3.5 Bitmaps 98
-
3.5.1 数据结构模型 98
-
3.5.2 命令 98
-
3.5.3 Bitmaps 分析 101
-
3.6 HyperLogLog 102
-
3.7 发布订阅 105
-
3.7.1 命令 106
-
3.7.2 使用场景 108
-
3.8 GEO 109
-
3.9 本章重点回顾 112
第 4 章 客户端 113
-
4.1 客户端通信协议 113
-
4.2 Java 客户端 Jedis 117
-
4.2.1 获取 Jedis 117
-
4.2.2 Jedis 的基本使用方法 118
-
4.2.3 Jedis 连接池的使用方法 122
-
4.2.4 Redis 中 Pipeline 的使用方法 125
-
4.2.5 Jedis 的 Lua 脚本 126
-
4.3 Python 客户端 redis-py 128
-
4.3.1 获取 redis-py 128
-
4.3.2 redis-py 的基本使用方法 128
-
4.3.3 redis-py 中 Pipeline 的使用方法 130
-
4.3.4 redis-py 中的 Lua 脚本使用方法 130
-
4.4 客户端管理 131
-
4.4.1 客户端 API 132
-
4.4.2 客户端相关配置 145
-
4.4.3 客户端统计片段 145
-
4.5 客户端常见异常 146
-
4.6 客户端案例分析 149
-
4.6.1 Redis 内存陡增 149
-
4.6.2 客户端周期性的超时 151
-
4.7 本章重点回顾 153
第 5 章 持久化 154
-
5.1 RDB 154
-
5.1.1 触发机制 154
-
5.1.2 流程说明 155
-
5.1.3 RDB 文件的处理 156
-
5.1.4 RDB 的优缺点 156
-
5.2 AOF 157
-
5.2.1 使用 AOF 157
-
5.2.2 命令写入 157
-
5.2.3 文件同步 158
-
5.2.4 重写机制 159
-
5.2.5 重启加载 161
-
5.2.6 文件校验 162
-
5.3 问题定位与优化 162
-
5.3.1 fork 操作 162
-
5.3.2 子进程开销监控和优化 163
-
5.3.3 AOF 追加阻塞 165
-
5.4 多实例部署 166
-
5.5 本章重点回顾 167
第 6 章 复制 168
-
6.1 配置 168
-
6.1.1 建立复制 168
-
6.1.2 断开复制 170
-
6.1.3 安全性 170
-
6.1.4 只读 170
-
6.1.5 传输延迟 171
-
6.2 拓扑 171
-
6.3 原理 172
-
6.3.1 复制过程 172
-
6.3.2 数据同步 175
-
6.3.3 全量复制 178
-
6.3.4 部分复制 181
-
6.3.5 心跳 183
-
6.3.6 异步复制 184
-
6.4 开发与运维中的问题 184
-
6.4.1 读写分离 184
-
6.4.2 主从配置不一致 186
-
6.4.3 规避全量复制 186
-
6.4.4 规避复制风暴 187
-
6.5 本章重点回顾 188
第 7 章 Redis 的噩梦:阻塞 189
-
7.1 发现阻塞 189
-
7.2 内在原因 191
-
7.2.1 API 或数据结构使用不合理 191
-
7.2.2 CPU 饱和 193
-
7.2.3 持久化阻塞 194
-
7.3 外在原因 195
-
7.3.1 CPU 竞争 195
-
7.3.2 内存交换 195
-
7.3.3 网络问题 196
-
7.4 本章重点回顾 199
第 8 章 理解内存 200
-
8.1 内存消耗 200
-
8.1.1 内存使用统计 200
-
8.1.2 内存消耗划分 201
-
8.1.3 子进程内存消耗 203
-
8.2 内存管理 204
-
8.2.1 设置内存上限 204
-
8.2.2 动态调整内存上限 204
-
8.2.3 内存回收策略 205
-
8.3 内存优化 209
-
8.3.1 redisObject 对象 209
-
8.3.2 缩减键值对象 210
-
8.3.3 共享对象池 211
-
8.3.4 字符串优化 213
-
8.3.5 编码优化 216
-
8.3.6 控制键的数量 223
-
8.4 本章重点回顾 225
第 9 章 哨兵 226
-
9.1 基本概念 226
-
9.1.1 主从复制的问题 227
-
9.1.2 高可用 227
-
9.1.3 Redis Sentinel 的高可用性 229
-
9.2 安装和部署 232
-
9.2.1 部署拓扑结构 232
-
9.2.2 部署 Redis 数据节点 233
-
9.2.3 部署 Sentinel 节点 234
-
9.2.4 配置优化 236
-
9.2.5 部署技巧 243
-
9.3 API 244
-
9.4 客户端连接 249
-
9.4.1 Redis Sentinel 的客户端 249
-
9.4.2 Redis Sentinel 客户端基本实现原理 249
-
9.4.3 Java 操作 Redis Sentinel 251
-
9.5 实现原理 254
-
9.5.1 三个定时监控任务 254
-
9.5.2 主观下线和客观下线 256
-
9.5.3 领导者 Sentinel 节点选举 258
-
9.5.4 故障转移 261
-
9.6 开发与运维中的问题 262
-
9.6.1 故障转移日志分析 262
-
9.6.2 节点运维 268
-
9.6.3 高可用读写分离 271
-
9.7 本章重点回顾 272
第 10 章 集群 274
-
10.1 数据分布 274
-
10.1.1 数据分布理论 274
-
10.1.2 Redis 数据分区 277
-
10.1.3 集群功能限制 278
-
10.2 搭建集群 278
-
10.2.1 准备节点 278
-
10.2.2 节点握手 280
-
10.2.3 分配槽 282
-
10.2.4 用 redis-trib.rb 搭建集群 284
-
10.3 节点通信 287
-
10.3.1 通信流程 287
-
10.3.2 Gossip 消息 287
-
10.3.3 节点选择 290
-
10.4 集群伸缩 291
-
10.4.1 伸缩原理 291
-
10.4.2 扩容集群 293
-
10.4.3 收缩集群 301
-
10.5 请求路由 305
-
10.5.1 请求重定向 305
-
10.5.2 Smart 客户端 309
-
10.5.3 ASK 重定向 318
-
10.6 故障转移 323
-
10.6.1 故障发现 323
-
10.6.2 故障恢复 329
-
10.6.3 故障转移时间 334
-
10.6.4 故障转移演练 334
-
10.7 集群运维 336
-
10.7.1 集群完整性 336
-
10.7.2 带宽消耗 337
-
10.7.3 Pub/Sub 广播问题 337
-
10.7.4 集群倾斜 338
-
10.7.5 集群读写分离 339
-
10.7.6 手动故障转移 341
-
10.7.7 数据迁移 344
-
10.8 本章重点回顾 344
第 11 章 缓存设计 346
-
11.1 缓存的收益和成本 346
-
11.2 缓存更新策略 347
-
11.3 缓存粒度控制 349
-
11.4 穿透优化 350
-
11.5 无底洞优化 352
-
11.6 雪崩优化 359
-
11.7 热点 key 重建优化 360
-
11.8 本章重点回顾 364
第 12 章 开发运维的“陷阱” 365
-
12.1 Linux 配置优化 365
-
12.1.1 内存分配控制 365
-
12.1.2 swappiness 367
-
12.1.3 THP 369
-
12.1.4 OOM killer 370
-
12.1.5 使用 NTP 371
-
12.1.6 ulimit 371
-
12.1.7 TCP backlog 372
-
12.2 flushall/flushdb 误操作 372
-
12.2.1 缓存与存储 373
-
12.2.2 借助 AOF 机制恢复 373
-
12.2.3 RDB 有什么变化 374
-
12.2.4 从节点有什么变化 374
-
12.2.5 快速恢复数据 374
-
12.3 安全的 Redis 375
-
12.3.1 Redis 密码机制 377
-
12.3.2 伪装危险命令 378
-
12.3.3 防火墙 380
-
12.3.4 bind 380
-
12.3.5 定期备份数据 381
-
12.3.6 不使用默认端口 381
-
12.3.7 使用非 root 用户启动 381
-
12.4 处理 bigkey 382
-
12.4.1 bigkey 的危害 382
-
12.4.2 如何发现 382
-
12.4.3 如何删除 383
-
12.4.4 最佳实践思路 386
-
12.5 寻找热点 key 386
-
12.6 本章重点回顾 391
第 13 章 Redis 监控运维云平台 CacheCloud 392
-
13.1 CacheCloud 是什么 392
-
13.1.1 现有问题 393
-
13.1.2 CacheCloud 基本功能 393
-
13.2 快速部署 395
-
13.2.1 CacheCloud 环境需求 395
-
13.2.2 CacheCloud 快速开始 395
-
13.3 机器部署 397
-
13.3.1 部署脚本 398
-
13.3.2 添加机器 399
-
13.4 接入应用 400
-
13.4.1 总体流程 401
-
13.4.2 账户申请和审批 401
-
13.4.3 应用申请和审批 402
-
13.4.4 客户端接入 405
-
13.5 用户功能 407
-
13.5.1 应用统计信息 408
-
13.5.2 实例列表 409
-
13.5.3 应用详情 409
-
13.5.4 命令曲线 409
-
13.5.5 CacheCloud Redis Shell 控制台 410
-
13.5.6 慢查询 410
-
13.5.7 应用拓扑 411
-
13.6 运维功能 413
-
13.6.1 应用运维 413
-
13.6.2 接入已存在的 Redis 节点 415
-
13.6.3 Redis 配置模板 416
-
13.6.4 迁移工具 417
-
13.6.5 监控报警 420
-
13.6.6 系统配置管理 422
-
13.7 客户端上报 423
-
13.7.1 客户端上报整体设计 424
-
13.7.2 Jedis 核心代码修改 424
-
13.7.3 带上报功能的客户端 426
-
13.7.4 CacheCloud 客户端统计 427
-
13.8 本章重点回顾 429
第 14 章 Redis 配置统计字典 430
-
14.1 info 系统状态说明 430
-
14.1.1 命令说明 430
-
14.1.2 详细说明 431
-
14.2 standalone 配置说明和分析 436
-
14.2.1 总体配置 436
-
14.2.2 最大内存及策略 437
-
14.2.3 AOF 相关配置 437
-
14.2.4 RDB 相关配置 438
-
14.2.5 慢查询配置 438
-
14.2.6 数据结构优化配置 439
-
14.2.7 复制相关配置 439
-
14.2.8 客户端相关配置 440
-
14.2.9 安全相关配置 440
-
14.3 Sentinel 配置说明和分析 440
-
14.4 Cluster 配置说明和分析 441