內容簡介
本書全面講解
Redis基本功能及其
套用,並結合線上開發與運維監控中的實際使用案例,深入分析並總結了實際開發運維中遇到的“陷阱”,以及背後的原因, 包含大規模集群開發與管理的場景、套用案例與開發技巧,為高效開發運維提供了大量實際經驗和建議。本書不要求讀者有任何Redis使用經驗,對入門與進階DevOps的開發者提供有價值的幫助。主要內容包括:Redis的安裝配置、API、各種高效功能、客戶端、持久化、複製、高可用、記憶體、哨兵、集群、快取設計等,Redis高可用集群解決方案,Redis設計和使用中的問題,最後提供了一個開源工具:Redis監控運維雲平台CacheCloud。
作者簡介
付磊
搜狐視頻高級研發工程師,CacheCloud項目聯合創始人。擁有多年Redis開發運維經驗,為公司多個核心業務提供Redis服務,同時熱衷於技術傳播和分享,撰寫了大量關於Redis開發運維的技術文章。
張益軍 搜狐視頻資深研發工程師,CacheCloud項目聯合創始人,曾就職於美團、阿里巴巴等公司。搜狐視頻投放組負責人,目前從事投放平台、反作弊等系統的架構設計和最佳化工作。研究興趣包括海量峰值訪問、分散式存儲等。
圖書目錄
序 言
前 言
致 謝
第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