一、Redis 持久化
- Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。
2、Redis 持久化拥有以下三种方式:
2.1 快照方式(RDB, Redis DataBase)
- 将某一个时刻的内存数据,以二进制的方式写入磁盘;
2.2 文件追加方式(AOF, Append Only File)
- 记录所有的操作命令,并以文本的形式追加到文件中;
2.3 混合持久化方式
- Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险。
二、Redis 持久化—RDB
1、RDB简介
- RDB(Redis DataBase)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的过程。
- RDB 的持久化触发方式有两类:一类是手动触发,另一类是自动触发。
2、手动触发
- 手动触发持久化的操作有两个: save 和 bgsave
- 它们主要区别体现在:是否阻塞 Redis 主线程的执行。
2.1 save 命令:使 Redis 处于阻塞状态
- 在客户端中执行 save 命令,就会触发 Redis 的持久化,但同时也是使 Redis 处于阻塞状态,直到 RDB 持久化完成,才会响应其他客户端发来的命令,所以在生产环境一定要慎用。
2.2 bgsave 命令 :只有在 fork() 子进程时有短暂的阻塞
- bgsave(background save)既后台保存的意思, 它和 save 命令最大的区别就是 bgsave 会 fork() 一个子进程来执行持久化,整个过程中只有在 fork() 子进程时有短暂的阻塞,当子进程被创建之后,Redis 的主进程就可以响应其他客户端的请求了,相对于整个流程都阻塞的 save 命令来说,显然 bgsave 命令更适合我们使用。
3、自动触发
- RDB 自动持久化主要来源于以下几种情况:
3.1 save m n
- save m n 是指在 m 秒内,如果有 n 个键发生改变,则自动触发持久化。
- 参数 m 和 n 可以在 Redis 的配置文件中找到,例如,save 60 1 则表明在 60 秒内,至少有一个键发生改变,就会触发 RDB 持久化。
- 自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgsave 命令。 注意:当设置多个 save m n 命令时,满足任意一个条件都会触发持久化。
3.2 flushall
- flushall 命令用于清空 Redis 数据库,在生产环境下一定慎用,当 Redis 执行了 flushall 命令之后,则会触发自动持久化,