# 011. redis 的 RDB 持久化配置以及数据恢复实验

# 如何配置 RDB 持久化机制

/etc/redis/6379.conf

save 900 1
save 300 10
save 60 10000
1
2
3

以上内容是原始默认的配置,该功能叫做 SNAPSHOTTING(快照)

save <seconds> <changes>:当 n 秒后有 n 个 key 发生改变,就做一次快照备份

可以设置多个检查点,默认设置了 3 个检查点

# RDB 持久化机制的工作流程

  1. redis 根据配置自己尝试去生成 rdb 快照文件
  2. fork 一个子进程出来
  3. 子进程尝试将数据 dump 到临时的 rdb 快照文件中
  4. 完成 rdb 快照文件的生成之后,就替换之前的旧的快照文件

每次生成一个新的快照,都会覆盖之前的老快照,所以只会有一个 dump.rdb

# 基于 RDB 持久化机制的数据恢复实验

思路:

  1. 保存几条数据
  2. 关闭 redis
  3. 重启 redis
  4. 检查数据是否还在

下面使用命令来实验

redis-cli
set k1 11
set k2 22
set k3 33
exit
redis-cli shutdown
# 启动 redis
cd /etc/init.d/
./redis_6379 start
# 进入 cli 查看数据是否还存在
redis-cli
get k1
get k2
1
2
3
4
5
6
7
8
9
10
11
12
13

实验证明数据还是存在的。

这里有一个争议点,因为是 redis 自带的停止工具,是一种安全的退出模式,会将内存中的数据立即生成一份 rdb 快照文件,该文件存储在 /var/redis/6379/dump.rdb 中

下面再来测试 2 种非安全的退出模式:

第一种

写入几条数据,然后直接 kill 掉 redis 进程,启动后会发现数据丢失了

第二种

  1. 手动配置一个 save 5 1

  2. 写入几条数据,等待 5 秒钟,会发现自动进行了一次 dump rdb 快照

    可通过查看 dump.rdb 文件更新时间确定

  3. kill -9 redis 进程

  4. 启动 redis 查看数据

    因为有 save 生效,所以数据都在;

TIP

在非正常退出 redis 的时候,再次启动会报错

[root@eshop-cache01 init.d]# ./redis_6379 start /var/run/redis_6379.pid exists, process is already running or crashed

由此可以看出来,当 redis 启动的时候回生成一个 pid 文件,如果该文件存在则不能再次启动

这里只能先删除该 pid 文件后,才能启动 redis 了