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

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了