Skip to content

Commit 429bb90

Browse files
committed
redis
1 parent f276672 commit 429bb90

File tree

1,523 files changed

+128010
-363
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,523 files changed

+128010
-363
lines changed

docs/.vuepress/config.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ module.exports = {
3333
//logo: './public/img/logo.png',
3434
subSidebar: 'auto',//在所有页面中启用自动生成子侧边栏,原 sidebar 仍然兼容
3535
nav: [
36-
{ text: 'Java', link: '/java/' },
36+
{ text: 'Java', link: '/java/' , icon: 'reco-api'},
3737
{ text: '数据结构与算法', link: '/data-structure-algorithms/' },
3838
{ text: '设计模式', link: '/design-pattern/' },
39-
{ text: '数据存储与缓存', link: '/data-store/' },
39+
{ text: '数据存储与缓存', link: '/data-store/'},
4040
{ text: '开发框架', link: '/framework/' },
4141
{ text: '分布式架构', link: '/distribution/' },
4242
{ text: '直击面试', link: '/interview/' },
@@ -84,7 +84,16 @@ module.exports = {
8484
// link: '/donate'
8585
// }
8686
// ]
87-
}]
87+
}],
88+
[
89+
'vuepress-plugin-mathjax',
90+
{
91+
target: 'svg',
92+
macros: {
93+
'*': '\\times',
94+
},
95+
},
96+
],
8897
]
8998
}
9099

@@ -187,6 +196,8 @@ function genDataStoreSidebar(){
187196
['Redis/Redis-Conf', 'Redis 配置'],
188197
['Redis/Redis-Transaction', 'Redis 事务'],
189198
['Redis/Reids-Lock', 'Redis 分布式锁'],
199+
['Redis/Redis-Master-Slave', 'Redis 主从'],
200+
['Redis/Redis-Sentinel', 'Redis 哨兵'],
190201
['Redis/Redis-Cluster', 'Redis 集群'],
191202
]
192203
}

docs/data-store/Redis/Redis-Cluster.md

Lines changed: 22 additions & 351 deletions
Large diffs are not rendered by default.

docs/data-store/Redis/Redis-Master-Slave.md

Lines changed: 221 additions & 0 deletions
Large diffs are not rendered by default.

docs/data-store/Redis/Redis-Persistence.md

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢
1414

1515
#### 是什么
1616

17-
**在指定的时间间隔内将内存中的数据集快照写入磁盘**,也就是行话讲的 Snapshot 快照,它恢复时是将快照文件直接读到内存里。
17+
**在指定的时间间隔内将内存中的所有数据集快照写入磁盘**,也就是行话讲的 Snapshot 快照,它执行的是**全量快照**,它恢复时是将快照文件直接读到内存里。
18+
19+
> 这就类似于照片,当你给朋友拍照时,一张照片就能把朋友一瞬间的形象完全记下来。
1820
1921
Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。RDB 的缺点是最后一次持久化后的数据可能丢失。
2022

2123
> **?** What ? Redis 不是单进程的吗?
2224
23-
Redis 使用操作系统的多进程 COW(Copy On Write) 机制来实现快照持久化, fork 是类 Unix 操作系统上**创建进程**的主要方法。COW(Copy On Write)是计算机编程中使用的一种优化策略。
25+
Redis 使用操作系统的多进程 COW(Copy On Write) 机制来实现快照持久化(在执行快照的同时,正常处理写操作), fork 是类 Unix 操作系统上**创建进程**的主要方法。COW(Copy On Write)是计算机编程中使用的一种优化策略。
2426

2527
#### Fork
2628

@@ -35,6 +37,10 @@ rdb 默认保存的是 **dump.rdb** 文件
3537
- save:在主线程中执行,会导致阻塞;
3638
- bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。
3739

40+
> 简单来说,bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么,主线程和 bgsave 子进程相互不影响。但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。
41+
>
42+
> ![](https://static001.geekbang.org/resource/image/4d/cc/4dc5fb99a1c94f70957cce1ffef419cc.jpg)
43+
3844
比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:
3945

4046
`save 60 1000 `
@@ -283,7 +289,7 @@ AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制
283289

284290
- RDB 持久化方式能够在指定的时间间隔能对你的数据进行快照存储
285291

286-
- AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以 redis 协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行后台重写**bgrewriteaof**),使得 AOF 文件的体积不至于过大
292+
- AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF 命令以 redis 协议追加保存每次写的操作到文件末尾。Redis 还能对 AOF 文件进行后台重写**bgrewriteaof**),使得 AOF 文件的体积不至于过大
287293

288294
- 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。
289295

@@ -295,13 +301,25 @@ AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制
295301
#### 性能建议
296302

297303
- 因为 RDB 文件只用作后备用途,建议只在 Slave上持久化 RDB 文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。
298-
- 如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的 AOF 文件就可以了。代价一是带来了持续的 IO,二是 AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少 AOF rewrite 的频率,AOF 重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。
299-
- 如果不 Enable AOF ,仅靠 Master-Slave Replication 实现高可用性也可以。能省掉一大笔 IO ,也减少了rewrite 时带来的系统波动。代价是如果 Master/Slav e同时宕掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。
304+
- 如果 Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只 load 自己的 AOF 文件就可以了。代价一是带来了持续的 IO,二是 AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少 AOF rewrite 的频率,AOF 重写的基础大小默认值 64M 太小了,可以设到 5G 以上。默认超过原大小 100% 大小时重写可以改到适当的数值。
305+
- 如果不 Enable AOF ,仅靠 Master-Slave Replication 实现高可用性也可以。能省掉一大笔 IO ,也减少了rewrite 时带来的系统波动。代价是如果 Master/Slav e同时宕掉,会丢失十几分钟的数据,启动脚本也要比较两个 Master/Slave 中的 RDB 文件,载入较新的那个。
300306

301307

302308

309+
Redis 4.0 中提出了一个**混合使用 AOF 日志和内存快照的方法**。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。
303310

311+
这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。
304312

305-
> https://www.wmyskxz.com/2020/03/13/redis-7-chi-jiu-hua-yi-wen-liao-jie/
306-
>
307-
> https://redis.io/topics/persistence
313+
如下图所示,T1 和 T2 时刻的修改,用 AOF 日志记录,等到第二次做全量快照时,就可以清空 AOF 日志,因为此时的修改都已经记录到快照中了,恢复时就不再用日志了。
314+
315+
![img](https://static001.geekbang.org/resource/image/e4/20/e4c5846616c19fe03dbf528437beb320.jpg)
316+
317+
这个方法既能享受到 RDB 文件快速恢复的好处,又能享受到 AOF 只记录操作命令的简单优势,颇有点“鱼和熊掌可以兼得”的感觉
318+
319+
320+
321+
## 参考:
322+
323+
https://www.wmyskxz.com/2020/03/13/redis-7-chi-jiu-hua-yi-wen-liao-jie/
324+
325+
https://redis.io/topics/persistence

0 commit comments

Comments
 (0)