部分 Redis初始篇0 O& X2 }8 P& P1 A" H% l1 v( p
第1章 初识NoSQL 2
3 G5 G3 g, v, k3 D1.1 什么是NoSQL 2& U. W* ^! q# G* _, k" Q
1.2 NoSQL与传统关系型数据库的比较 3% x. z( C, u, y7 W& K- F0 ^2 W ?
1.3 在什么应用场景下使用NoSQL 4$ K5 D* Y5 n' Y1 m1 J! t
1.4 NoSQL的数据模型 5. t# a; ~4 r( M4 q; C0 R
1.5 NoSQL数据库的分类 6% @7 V6 ^+ ?/ i5 t& {/ k5 r
1.5.1 NoSQL数据库分类简介 63 d8 k$ i/ U6 @( ]3 X* c( R
1.5.2 各类NoSQL数据库的比较 6
" j& U( N. _) b( i% ~第2章 认识Redis 8
; M1 ^* H8 E$ @6 t2.1 Redis简介 8# _1 {3 A3 u, }7 i8 I( | U8 g
2.1.1 Redis的由来 8+ c( C2 }9 B6 V0 ?" q. S g2 F- Z
2.1.2 什么是Redis 8
. K" t6 L9 y. J g$ @2.1.3 Redis的特性 8# V& l8 |, U# a9 Z
2.1.4 Redis的使用场景 90 z. U$ e0 z! m2 j7 \6 @
2.2 搭建Redis环境 10; @& b8 _4 M: d
2.2.1 在Window环境下搭建 10 U6 i: r) Z7 i4 M+ G* B; y
2.2.2 在Linux环境下搭建 13- y; K$ C. ?: T# {/ O# B8 y D
2.3 Redis客户端 14 a# _/ M9 C0 e8 r+ e
2.3.1 命令行客户端 14: S; \# W( E7 }0 J5 ?
2.3.2 可视化客户端 15+ T6 O7 V" _+ g
2.3.3 编程客户端 17: @! {$ N$ w' S; {3 U9 o
2.4 Redis的启动方式 18
" }7 a( K. B/ O0 ?8 U) H r: }2.4.1 在Window环境下的启动方式 181 L; N# d/ M4 a6 v
2.4.2 在Linux环境下的启动方式 197 e8 m6 L8 J# V3 F6 F; Z
第3章 Redis数据类型 21
( S3 T$ K' z4 H3.1 Redis数据类型之字符串(String)命令 21& }' D8 K2 O+ }$ a
3.1.1 设置键值对 22
$ G1 l( O. m% r- f3.1.2 获取键值对 246 Q4 I( ]2 D9 P0 e; \9 X) n
3.1.3 键值对的偏移量 26) e) R! f! E( F. P4 i
3.1.4 设置键的生存时间 26+ v1 D4 Z/ V- U6 H: u3 l4 j
3.1.5 键值对的值操作 274 I* v+ `+ z4 p/ w' k, V0 m
3.1.6 键值对的计算 29, P; U+ ]3 g% u% z4 n
3.1.7 键值对的值增量 31% o$ l X$ Q4 d+ x
3.2 Redis数据类型之哈希(Hash)命令 34
9 x( |0 h$ o3 f- s' l3.2.1 设置哈希表域的值 34
$ [, d' a; }1 o H7 f3.2.2 获取哈希表中的域和值 36
9 {& N& c1 q/ [3.2.3 哈希表统计 38
2 H( p e$ t6 ^3.2.4 为哈希表中的域加上增量值 391 j% |) S# Y7 [+ M- L" e. A
3.2.5 删除哈希表中的域 40
. W0 k3 h: k. u) A, _3 Z; X3.3 Redis数据类型之列表(List)命令 41) P) @3 ?8 ~/ x4 E& N5 E
3.3.1 向列表中插入值 419 V: P n! n1 X. S, {8 s/ x0 U( H) @
3.3.2 获取列表元素 44
4 M- {6 \9 _6 m. Y( I' d) }3.3.3 删除列表元素 46
1 I5 ~4 a$ n* A, {( ~& d3.3.4 移动列表 50
8 n0 p! l9 L% L8 f p, U: G9 D3.3.5 列表模式 52
* P) V, M8 D! |8 D6 l: M3.4 Redis数据类型之集合(Set)命令 53* y- p- Y) w+ Q
3.4.1 向集合中添加元素 53! J- R/ }5 [% E+ ?+ h
3.4.2 获取集合元素 54
Z I6 U! M4 X0 S3.4.3 集合运算 574 C) f5 l2 n! G( h% H
3.4.4 删除集合元素 60) M/ J f6 i" d; j5 K- O
3.5 Redis数据类型之有序集合(Sorted Set)命令 618 y/ F* t2 c7 b k, m- ]( v, }
3.5.1 添加元素到有序集合中 62) P9 a3 U; s% Z! s y# j
3.5.2 获取有序集合元素 63
7 L& {3 b9 P# Q# ^4 S i3.5.3 有序集合排名 69
2 Y$ l8 Y y/ |4 ~3.5.4 有序集合运算 71; @; C2 E- |, X4 `
3.5.5 删除有序集合元素 72
* k* j6 x: U- l. u0 i第4章 Redis命令 76
+ @5 h+ D0 x( _8 a# Q4.1 键(key)命令 76
7 \* t' e3 _1 K" Q4.1.1 查询键 766 t, U( i" L' {0 V+ x4 X
4.1.2 修改键 79
r9 U: I+ F+ Z4.1.3 键的序列化 81
% z/ J2 S7 t) f6 X1 c' ^0 v4.1.4 键的生存时间 82
, S7 f/ q( ]6 k; Z/ f4.1.5 键值对操作 85% E8 T# h& `0 [ G5 ^# t# a# G
4.1.6 删除键 895 h: Z" }. ]9 `* W, {% H; [# @
4.2 HyperLogLog命令 90
% ?; H3 T# h+ q1 N4.2.1 添加键值对到HyperLogLog中 90
; U% p6 ?1 B q- y+ e4.2.2 获取HyperLogLog的基数 91
8 B$ v* I) d7 e4 i4.2.3 合并HyperLogLog 925 H$ K8 m/ ^. D- d
4.3 脚本命令 928 }! v4 b* h1 c
4.3.1 缓存中的Lua脚本 92$ m# z9 `, H, V# R: x2 s( T
4.3.2 对Lua脚本求值 93
' G+ H1 S" _! m% C4 g% v4 \2 R4.3.3 杀死或清除Lua脚本 95
# N) P: N6 H- D4.4 连接命令 96+ U n$ H. ^7 c: p2 J0 |! h6 C
4.4.1 解锁密码 96
0 c& z$ ]; @. x6 E; Z4.4.2 断开客户端与服务器的连接 97
3 @1 V" k; @- _& M$ b& F, h4.4.3 查看服务器的运行状态 97
' A6 k, G$ G8 ~4.4.4 输出打印消息 977 a0 W }; z. E# [
4.4.5 切换数据库 98
v% _* i2 c: g' v) A' p$ ~4.5 服务器命令 98
+ b, F7 C+ w7 g u7 V* z) E* y* t4.5.1 管理客户端 986 G$ I9 S1 d' B9 i4 z! @
4.5.2 查看Redis服务器信息 101! _3 O+ t3 U# ~: T# u
4.5.3 修改并查看相关配置 108
5 ~( e4 D0 S# H# l2 w4.5.4 数据持久化 111
% J% o N! h7 `( |9 f3 P4.5.5 实现主从服务 112
; M" s5 P: q' G$ ^4.5.6 服务器管理 114
, u& s# Z% a: R! l# D' V% ]第5章 Redis数据库 116
" }; S- V& U! l. U# H5.1 Redis数据库切换 116
/ w- U* B `8 `7 ?/ W, @8 J0 }5.2 Redis数据库中的键操作 117
6 J/ P( w% L% q* B* | a5.2.1 添加键 118
9 x/ w3 V" _$ R( Q/ E- r' d5.2.2 修改键 118
6 y/ @4 `5 }- y1 d7 u5.2.3 删除键 120
' H% V0 i# }3 m2 N- P8 ]5.2.4 取键值 121
" v3 m, a8 h& w1 X5.3 Redis数据库通知 121
! K7 u: p M9 i) `; O; X5.3.1 数据库通知分类 122
2 |+ W8 E( o0 M5.3.2 数据库通知的实现原理 124$ o6 w! ^/ [# S: O# D& z
第二部分 Redis进阶篇! }; V4 o( X) q% s/ {) J* Q) O
第6章 Redis客户端与服务器 126 |6 q/ F: {: c+ m& ]( I, w
6.1 Redis客户端 126; X) j, j- L A) F1 V1 d
6.1.1 客户端的名字、套接字、标志和时间属性 126+ g8 K) z6 V/ b
6.1.2 客户端缓冲区 129) [. D+ _# |; k. p
6.1.3 客户端的authenticated属性 131
0 W+ w3 _7 e+ e h6.1.4 客户端的argv和argc属性 131
% c& E6 f) H A6.1.5 关闭客户端 132( [2 i2 b, K) v: m9 H- N5 S" M
6.2 Redis服务器 132$ I7 O: N0 s0 q
6.2.1 服务器处理命令请求 132& O# x8 ^) }" z" \' v# O7 J3 }
6.2.2 服务器发送命令 133
8 V# w/ z1 u. q4 I6.2.3 服务器执行命令 1344 c9 Y( D! k# t" j8 f
6.2.4 服务器返回命令结果 135
o( `9 k# s6 J H* I) ^( O6.3 服务器函数 1363 U' y# a/ `8 G1 d' c# m; f* V6 ?
6.3.1 serverCron函数 136# j9 P, u6 _1 x/ y: r
6.3.2 trackOperationsPerSecond函数 1377 X9 w9 O1 h7 \
6.3.3 sigtermHandler函数 137
$ M& j- k# ~ R3 ]7 O" l. `7 `) t6.3.4 clientsCron函数 138; A v* ~5 m) d% i( @ |
6.3.5 databasesCron函数 1389 E- Z) d5 T* |& w. y
6.4 服务器属性 138
$ B! |& ]7 [$ P5 a2 v' \% G6.4.1 cronloops属性 138
+ C* L/ A: i3 }6 [# V, [+ A: V0 t6.4.2 rdb_child_pid与aof_child_pid属性 138
( ^8 x5 _8 ^+ G6.4.3 stat_peak_memory属性 1390 I, ?( g0 u* w, e+ E: v2 G
6.4.4 lruclock属性 140
$ P2 e; G/ a$ E6.4.5 mstime与unixtime属性 141
. n# Y m( ^5 m6.4.6 aof_rewrite_scheduled属性 141
% s" v, t. j4 @& U4 Y" U6 k, d6.5 Redis服务器的启动过程 141- n, H, d' X, `9 N$ b7 Q$ Q
6.5.1 服务器状态结构的初始化 142
' g* d h. T7 V( W9 i3 M* x6.5.2 相关配置参数的加载 142
- l$ V4 f1 ]& N. O/ S5 o+ e* Q, {6.5.3 服务器数据结构的初始化 142, R/ J7 Q1 C& ~; i
6.5.4 数据库状态的处理 143 e- d" K/ o- F* H3 n
6.5.5 执行服务器的循环事件 144
: b- C; |' t9 c* B* w8 |( E1 K第7章 Redis底层数据结构 145
: p/ ~. h5 l1 O$ g6 {7.1 Redis简单动态字符串 1457 A' a6 V% d# W( Y* F
7.1.1 SDS的实现原理 145. r4 S6 c G1 B1 _5 l% F
7.1.2 SDS API函数 147* s) L4 G% I* b X. i4 z4 A- M
7.2 Redis链表 148" {0 o7 [& y4 j+ E; O- w. f
7.2.1 链表的实现原理 148
( a8 E) D1 a8 Z8 Q( A7.2.2 链表API函数 150
4 v, Z# w+ S( _' u/ w! }+ }3 {3 ?7.3 Redis压缩列表 151
# ~2 L8 h0 s2 @$ ]0 a7.3.1 压缩列表的实现原理 151
2 W5 W" z3 ]* n0 u0 o+ H7.3.2 压缩列表API函数 153
6 @1 w9 Y3 f5 ], H7.4 Redis快速列表 154
9 m, _. ^% w9 ]; F2 L8 }( u7.4.1 快速列表的实现原理 154
k/ i8 T, u5 {$ X* K5 U7.4.2 快速列表API函数 156$ }* o& ~5 E- m" s
7.5 Redis字典 157
# S7 O2 L* q, m7.5.1 字典的实现原理 1574 D0 Q. N/ S5 b3 ?, `- ?, n# n) @: d5 q
7.5.2 字典API函数 1602 {6 d( _8 Z* |
7.6 Redis整数集合 161
5 D# I* H# m$ A" j, \! ]7.6.1 整数集合的实现原理 161( r3 A6 d) y% g0 w
7.6.2 整数集合API函数 1636 h1 W0 W" U, ~5 k2 d2 o! g
7.7 Redis跳表 164" }) g( b* V9 D( @# w! T9 N
7.7.1 跳表的实现原理 164* e3 D* z5 ^3 K* @( u$ W1 U
7.7.2 跳表API函数 166
i* u4 v( `$ w7 [' ?/ n: r4 W; |! T, W7.8 Redis中的对象 167
$ x6 F% b" c+ T2 |4 L) I7.8.1 对象类型 167% \: I2 c, G1 ]2 Y+ Y8 `, H
7.8.2 对象的编码方式 171
" Y9 E) j0 b: P n8 g; `; E第8章 Redis排序 174
) j# E; y/ O2 ]' O* U$ o8.1 SORT排序命令 174) U1 k" J- L+ V/ K* o
8.2 升序(ASC)与降序(DESC) 176- t6 N" k: b, l& O/ [; y
8.3 BY参数的使用 177
: O2 q7 `1 B9 Q" l& G8.4 LIMIT参数的使用 1807 j2 b# ^: D) Y" ^6 k5 {, M
8.5 GET与STORE参数的使用 181
/ } Y7 x- k3 q8 ^7 V1 I2 u- ]1 @8.6 多参数执行顺序 185' D( V: i* V* c4 `/ ^) ^
第9章 Redis事务 187
0 ?8 i3 Q- m4 b9.1 Redis事务简介 187
8 K% N. h, T0 y# d) D+ y; W4 u, ^9.2 Redis 事务的ACID特性 188$ @9 ~+ k" A4 E- c. s" @
9.2.1 事务的原子性 188# g/ \$ G3 i1 J" q/ w
9.2.2 事务的一致性 1905 \ J& I) P/ H
9.2.3 事务的隔离性 1922 q8 J( E& C- B, D9 g
9.2.4 事务的持久性 193
& i+ Y# C# h- P% Q4 {9.3 Redis事务处理 194# [. n) [5 v* g/ h$ r0 f" S: g
9.3.1 事务的实现过程 194
* l& }5 s) `0 i( x* E- N9.3.2 悲观锁和乐观锁 1973 i* V' `6 _5 j
9.3.3 事务的WATCH命令 198/ c1 W/ g+ T7 S$ c4 y3 e
第10章 Redis消息订阅 202: |. B7 q7 z# m9 v; u& b
10.1 消息订阅发布概述 202+ Q9 H/ @% T6 r& @- q
10.2 消息订阅发布实现 203
8 t3 O5 G5 h7 p, ?$ f! s4 M10.2.1 消息订阅发布模式命令 203
# Q; |; U& y% b# x10.2.2 消息订阅功能之订阅频道 208 d( t3 L! z$ ^6 x% l
10.2.3 消息订阅功能之订阅模式 210
2 R4 W% J% Q, z( R/ X3 n) }, B, {: T10.3 Redis消息队列 211
! r5 C% i+ m* A& _' U1 N10.3.1 消息订阅发布模式的原理 211) m, R- k! R3 ^% x
10.3.2 消息生产者/消费者模式的原理 212
0 o1 {% ^- f7 K第11章 Redis持久化 213
! M( j: [; ?, i/ x8 w11.1 Redis持久化操作概述 213
& b1 p8 q" j, t% c" u& M! G11.2 Redis持久化机制AOF 214! U5 B$ f$ k4 ~
11.2.1 AOF持久化的配置 214
0 G: z0 [0 ~3 p( @* V11.2.2 AOF持久化的实现 215: ]6 V4 ?3 m9 U G, E* K
11.2.3 AOF文件重写 216
; m: G) ~$ Q6 E2 a' ~11.2.4 AOF文件处理 2207 Z2 S) `0 a! F& _0 `- x9 G& B
11.2.5 AOF持久化的优劣 221
9 I% g: E0 d' {" g! I# w9 Z0 u; r( Z11.3 Redis持久化机制RDB 222
' `' I8 c% {- a6 ~: a; s: a! u& s11.3.1 RDB持久化 2220 S( G9 H% T+ }: m1 E: ?
11.3.2 RDB文件 224
' ?& u0 }8 S s7 P+ k0 { f; H11.3.3 RDB文件的创建与加载 226
) E1 V% R6 M4 f7 o Q+ C- v6 o) |11.3.4 创建与加载RDB文件时服务器的状态 228, F% m) a/ X1 I" G+ q: a/ h
11.3.5 RDB持久化的配置 228: I! G) j7 |, X- q# w- P
11.3.6 RDB持久化的优劣 229
6 p0 f1 w: _' _8 Z$ i11.4 AOF持久化与RDB持久化抉择 230
. I' Z4 X7 M$ y! s第12章 Redis集群 231& ~& Q7 G9 e& v! E* l6 x- |
12.1 Redis集群的主从复制模式 231" {+ o% _2 A0 A, A' G& W8 ]
12.1.1 什么是主从复制 2317 P8 {' G/ E% R# _: L) b9 L: K
12.1.2 主从复制配置 234
: N0 D" d; ?4 j3 K* @6 x12.1.3 复制功能的原理 237
& `4 w5 p, C2 i2 @% h5 n12.1.4 复制功能的实现步骤 2423 u" V5 x0 H9 `7 L# X, z) @
12.1.5 Redis读写分离 245
9 L; r5 B- d. l& ~6 k12.1.6 Redis心跳机制 246
$ h3 n1 G4 H' v U12.2 Redis集群的高可用哨兵模式 247
- P8 @2 ^! l( C- }9 ~12.2.1 什么是高可用哨兵模式 248 R$ p' I- n5 L
12.2.2 哨兵模式的配置 249% _# K$ n. z. l9 T
12.2.3 Sentinel的配置选项 255+ r. F7 x7 h) u" C8 h0 U
12.2.4 哨兵模式的实现原理 256) w8 f; Y( j6 E/ w
12.2.5 选择“合适”的slave节点作为master节点 263
: ~% q5 U$ l- \8 n! w12.2.6 Sentinel的下线状态 266; M* R/ l9 G4 P4 w2 a6 Q
12.2.7 Sentinel内部的定时任务 267# a( `. ~# u& w. ~+ Y2 s0 S. l6 j
12.3 Redis集群搭建 268
- c' W7 _& S- j% W12.3.1 什么是Redis集群 268
) J# t$ }; X0 V9 q% z9 J [( I9 ^12.3.2 集群中的节点和槽 269: ~0 ^% e7 ]" m7 q. A
12.3.3 集群搭建 2747 b2 ]3 {. H8 ]: `
12.3.4 使用Redis集群 285! O: I+ S7 Q7 m6 U
12.3.5 集群中的错误 2876 r1 W/ B* `' k% e& K
12.3.6 集群的消息 289* F. R" w! T' i/ x$ u- B; s
第13章 Redis高级功能 291
2 H: W# p) z2 s1 r$ l. u13.1 慢查询 291
" i; x }8 u: x( @! R13.1.1 配置慢查询 291/ @; {+ B( e, ^% C" w" ^
13.1.2 慢查询的生命周期 293. s! i' c6 T7 r. H# V% q/ Y
13.1.3 慢查询日志 294
+ y- \) C- j% ?13.1.4 慢查询命令 296- j; \0 A& R7 y- ~; P
13.2 流水线 297$ M! [9 p) z6 ?% G
13.2.1 什么是Pipeline技术 2975 l& e4 d P7 ?
13.2.2 如何使用Pipeline技术 298
! W' R8 i1 v/ o" R) s) g" L13.3 地理位置的应用 298! Z! `& }) {. T: [, [$ F- f! D
13.3.1 存储地理位置 298! l H: L* g3 ?, b }
13.3.2 获取地理位置的经纬度信息 299: N, D4 E# s9 X6 ^" J7 ^- M1 x
13.3.3 计算两地间的距离 300: |& Z/ `5 n X2 _% h4 r8 S
13.3.4 获取指定范围内的位置信息 300" P% _+ M* Q) |
13.4 位图 302; P5 Z. q9 T; M& e9 D
13.4.1 二进制位数组 302" J* g: c! O# U7 `
13.4.2 位数组的表示 304( d2 q: z+ ^" B% z9 }# ?
13.4.3 位数组的实现 305! I9 C* b( N3 @; P
第三部分 Redis实战篇
& I0 d( _0 V$ U第14章 Java操作Redis 3105 Z# c- K( x2 c4 u
14.1 Java客户端Jedis 310; R2 p( v5 R# j% D8 `
14.1.1 Jedis的获取 310) O1 @% Z5 ?; P1 [! ~& u+ u
14.1.2 Jedis的使用 311: d- p4 h; T# z( D; n+ j; A, G. _
14.1.3 Jedis常用API 311
( a% w6 @( R! w14.1.4 Jedis事务 313
' L: P& x$ k0 m6 l14.1.5 Jedis主从复制 316
2 u9 V, a0 a# _4 G% D14.1.6 Jedis的连接池 318, ? ~: y \% n. N( ~
14.2 Java操作Redis数据类型 321
9 T# M1 l7 _) p14.2.1 Java操作Redis字符串类型 322+ E; ~0 i9 J8 d/ q
14.2.2 Java操作Redis列表类型 323
5 Z" ]/ j; X* \6 Q( q8 n14.2.3 Java操作Redis集合类型 325
3 A; j; Z) B; h; I8 T14.2.4 Java操作Redis哈希表类型 326
% L& h3 o+ g3 g" Q, }7 A14.2.5 Java操作Redis有序集合类型 328) M- B# e" b, L5 g( X
14.3 Java操作Redis实现排行榜 329$ ^" |' u8 d4 q! D
14.4 Java操作Redis实现秒杀功能 332$ p2 ^8 B: F2 J( T9 `# O
14.5 Java操作Redis实现消息队列 335
7 ^5 V5 U9 C3 c; `1 h14.6 Java操作Redis实现故障转移 338
- d1 T% \9 p W% m; l7 d第15章 SpringBoot操作Redis 343
3 l4 I3 }( k9 n15.1 在SpringBoot中应用Redis 3431 y5 Y% x* ^" h @" ?( _4 Q$ M8 |
15.1.1 Redis依赖配置 343 java8.com0 \! s( A! Y6 b3 R; L# T* a( f+ [
15.1.2 Redis配置文件 344( `( T: Q& W* J8 f
15.2 SpringBoot连接Redis 3450 S( \ A# i. Y8 U9 z7 U6 H
15.3 SpringBoot整合Redis实现缓存 3529 J3 p. f5 n- E: x* C& e# e
第16章 Python操作Redis 364* m9 }5 Z. |$ z9 P& S" f, u$ }
16.1 在Python中应用Redis 364' X' u( Y: T7 S% }$ [
16.1.1 在PyCharm中配置Redis 364
" h3 i9 k# W! Q1 S, ]8 u9 S/ m0 L16.1.2 Python连接Redis 365/ D' ^7 L0 U$ `- q( i4 N* w
16.2 Python操作R1 l0 h0 V* {) ?9 |0 N6 I. H
) ]& ^7 t' U5 Q( i( p- W
; s8 {; r/ p" X