本書主要講解Redis基本功能及其應用,以及線上開發(fā)與運維監(jiān)控中的實際使用案例,包含大規(guī)模集群開發(fā)與管理的場景、應用案例與開發(fā)技巧,并總結了實際開發(fā)中遇到的坑。本書不要求讀者有任何Redis使用經驗,對入門與進階DevOps的開發(fā)者提供有價值的幫助。主要內容包括:Redis的安裝配置、API、客戶端、持久化、復制、高可用、集群、緩存設計等基本功能,Redis高可用集群解決方案,Redis設計和使用的問題,開發(fā)運維中的陷阱,CacheCloud私有云的開發(fā)案例等。
本書作者來自一線開發(fā)團隊,深入分析并總結了實際工作中遇到的陷阱,以及背后的原因, 包含大規(guī)模集群開發(fā)與管理的場景、案例、技巧,為高效開發(fā)運維提供了大量實際經驗和建議。本書不要求讀者有任何Redis使用經驗,對入門與進階DevOps的開發(fā)者提供有價值的幫助。
前 言?IntroductionRedis作為基于鍵值對的NoSQL數據庫,具有高性能、豐富的數據結構、持久化、高可用、分布式等特性,同時Redis本身非常穩(wěn)定,已經得到業(yè)界的廣泛認可和使用。掌握Redis已經逐步成為開發(fā)和運維人員的必備技能之一。
本書關注了Redis開發(fā)運維的方方面面,尤其對于開發(fā)運維中如何提高效率、減少可能遇到的問題進行詳細分析,但本書不單單介紹怎么解決這些問題,而是通過對Redis重要原理的解析,幫助開發(fā)運維人員學會找到問題的方法,以及理解背后的原理,從而讓開發(fā)運維人員不僅知其然,而且知其所以然。
本書涵蓋內容第1章 初識Redis,帶領讀者進入Redis的世界,了解它的前世今生、眾多特性、應用場景、安裝配置、簡單使用,最后對Redis發(fā)展過程中的重要版本進行說明,可以讓讀者對Redis有一個全面的認識。
第2章 API的理解和使用,全面介紹了Redis提供的5種數據結構字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)的數據模型、常用命令、典型應用場景,并且每個小節(jié)都會給出在Redis開發(fā)過程可能要注意的坑和技巧。同時本章還會對Redis的單線程處理機制、鍵值管理做一個全面介紹,通過對這些原理的理解,讀者可以在合適的應用場景選擇合適的數據結構和命令進行開發(fā),有效提高程序效率,降低可能產生的問題和隱患。
第3章 小功能大用處,除了5種數據結構外,Redis還提供了諸如慢查詢、Redis Shell、Pipeline、Lua腳本、Bitmaps、HyperLogLog、發(fā)布訂閱、GEO等附加功能,在這些功能的幫助下,Redis的應用場景更加豐富。
第4章 客戶端,本章重點關注Redis客戶端的開發(fā),介紹了Redis的客戶端通信協(xié)議、詳細講解了Java客戶端Jedis的使用技巧,同時通過從原理角度剖析在開發(fā)運維中,客戶端的監(jiān)控和管理技巧,最后給出客戶端開發(fā)中常見問題以及案例講解。
第5章 持久化,Redis的持久化功能有效避免因進程退出造成的數據丟失問題,本章首先介紹RDB和AOF兩種持久化配置和運行流程,其次對常見的持久化問題進行定位和優(yōu)化,最后結合Redis常見的單機多實例部署場景進行優(yōu)化。
第6章 復制,在分布式系統(tǒng)中為了解決單點問題,通常會把數據復制多個副本部署到其他機器,用于故障恢復和負載均衡等需求,Redis也是如此。它為我們提供了復制(replication)功能,實現了多個相同數據的Redis副本。復制功能是高可用Redis的基礎,后面章節(jié)的哨兵和集群都是在復制的基礎上實現高可用。
第7章 Redis的噩夢:阻塞,Redis是典型的單線程架構,所有的讀寫操作都在一條主線程中完成的。當Redis用于高并發(fā)場景時這條線程就變成了它的生命線。如果出現阻塞哪怕是很短時間對于我們的應用來說都是噩夢。導致阻塞問題的場景大致分為內在原因和外在原因,本章將進行詳細分析。
第8章 理解內存,Redis所有的數據存在于內存中,如何高效利用Redis內存變得非常重要。高效利用Redis內存首先需要理解Redis內存消耗在哪里,如何管理內存,最后再深入到如何優(yōu)化內存。掌握這些知識后相信讀者能夠實現用更少的內存存儲更多的數據從而降低成本。
第9章 哨兵,Redis從2.8版本開始正式提供了Redis Sentinel,它有效解決了主從復制模式下故障轉移的若干問題,為Redis提供了高可用功能。本章將一步步解析Redis Sentinel的相關概念、安裝部署、配置、命令使用、原理解析,最后分析了Redis Sentinel運維中的一些問題。
第10章 集群,是本書的重頭戲,Redis Cluster是Redis 3提供的Redis分布式解決方案,有效解決了Redis分布式方面的需求,理解應用好Redis Cluster將極大的解放我們對分布式Redis的需求,同時它也是學習分布式存儲的絕佳案例。本章將針對RedisCluster的數據分布,搭建集群,節(jié)點通信,請求路由,集群伸縮,故障轉移等方面進行分析說明。
第11章 緩存設計,緩存能夠有效加速應用的讀寫速度,以及降低后端負載,對于開發(fā)人員進行日常應用的開發(fā)至關重要,但是將緩存加入應用架構后也會帶來一些問題,本章將介紹緩存使用和設計中遇到的問題,具體包括:緩存的收益和成本、緩存更新策略、緩存粒度控制、穿透問題優(yōu)化、無底洞問題優(yōu)化、雪崩問題優(yōu)化、熱點key優(yōu)化。
第12章 開發(fā)運維的陷阱,介紹Redis開發(fā)運維中的一些棘手問題,具體包括:Linux配置優(yōu)化、flush誤操作數據恢復、如何讓Redis變得安全、bigkey問題、熱點key問題。
第13章 Redis監(jiān)控運維云平臺CacheCloud,介紹筆者所在團隊開源的Redis運維工具CacheCloud,它有效解決了Redis監(jiān)控和運維中的一些問題,本章將按照快速部署、機器部署、接入應用、用戶功能、運維功能多個維度全面的介紹CacheCloud,相信在它的幫助下,讀者可以更好的監(jiān)控和運維好Redis。
第14章 Redis配置統(tǒng)計字典,會對Redis的系統(tǒng)狀態(tài)信息以及全部配置做一個全面的梳理,希望本章能夠成為Redis配置統(tǒng)計字典,協(xié)助大家分析和解決日常開發(fā)和運維中遇到的問題。
目標讀者本書深入淺出地介紹了Redis相關知識,因此可以作為Redis新手的入門教程,同時本書凝聚了兩位筆者在Red
付磊 搜狐視頻工程師,主要負責設計開發(fā)搜狐視頻平臺中間件,為上百個業(yè)務和應用提供緩存存儲服務,每天調用量達1000億 ,涉及服務器上百臺,跨三個IDC,作為項目發(fā)起人,負責架構實現和主要模塊編寫。
序 言
前 言
致 謝
第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 發(fā)布訂閱 105
3.7.1 命令 106
3.7.2 使用場景 108
3.8 GEO 109
3.9 本章重點回顧 112
第4章 客戶端 113
4.1 客戶端通信協(xié)議 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 客戶端統(tǒng)計片段 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 觸發(fā)機制 154
5.1.2 流程說明 155
5.1.3 RDB文件的處理 156
5.1.4 RDB的優(yōu)缺點 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 問題定位與優(yōu)化 162
5.3.1 fork操作 162
5.3.2 子進程開銷監(jiān)控和優(yōu)化 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 開發(fā)與運維中的問題 184
6.4.1 讀寫分離 184
6.4.2 主從配置不一致 186
6.4.3 規(guī)避全量復制 186
6.4.4 規(guī)避復制風暴 187
6.5 本章重點回顧 188
第7章 Redis的噩夢:阻塞 189
7.1 發(fā)現阻塞 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 內存使用統(tǒng)計 200
8.1.2 內存消耗劃分 201
8.1.3 子進程內存消耗 203
8.2 內存管理 204
8.2.1 設置內存上限 204
8.2.2 動態(tài)調整內存上限 204
8.2.3 內存回收策略 205
8.3 內存優(yōu)化 209
8.3.1 redisObject對象 209
8.3.2 縮減鍵值對象 210
8.3.3 共享對象池 211
8.3.4 字符串優(yōu)化 213
8.3.5 編碼優(yōu)化 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數據節(jié)點 233
9.2.3 部署Sentinel節(jié)點 234
9.2.4 配置優(yōu)化 236
9.2.5 部署技巧 243
9.3 API