Redis的快照持久化

258 阅读4分钟

微信公众号:51码农网
关注可了解更多。问题或建议,请公众号留言;
如果你觉得对你有帮助,欢迎关注

什么是持久化

Redis为了内部数据安全,会把本身的数据以文件的方式保存到硬盘中一份,在服务器重启之后会把硬盘中的数据恢复到内存(redis)中,数据保存到硬盘的过程,就称为'持久化'。

Redis的持久化有两种方案,快照持久化和AOF,在具体的项目中,我们可以实际的情况选择合适的持久化方案。今天我们先说快照持久化。

什么是快照持久化

快照持久化,有些也称为Redis DataBase(简称RDB)方式持久化

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

RDB是Redis默认采用的持久化方式

在redis.conf配置文件中,可以进行持久化配置:RDB持久化条件、持久化文件路径、持久化文件名称。

RDB持久化条件

save 900 1
save 300 10
save 60 10000

save 开头的一行就是持久化条件配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系。
“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照。
“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。
“save 60 10000”表示1分钟(60秒)内至少10000个键被更改则进行快照。

持久化文件路径

#Note that you must specify a directory here, not a file name.
dir ./

持久化文件名称

#The filename where to dump the DB
dbfilename dump.rdb

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。

快照持久化-SAVE和BGSAVE

1.Redis SAVE 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。也即可以输入SAVE命令创建一个快照

1127.0.0.1:6379SAVE
2OK


SAVE 保存是阻塞主进程,客户端无法连接redis,等SAVE完成后,主进程才开始工作,客户端可以连接

2.BGSAVE 命令执行之后并没有立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

1127.0.0.1:6379BGSAVE
2Background saving started

触发SAVE或BGSAVE的几种情况

1.上面我们提到redis.conf配置的 RDB持久化的条件

save 900 1 save 300 10 save 60 10000

当其满足条件的时候,触发的是 BGSAVE

Redis 会单独的创建(fork) 一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束了,再用这个临时文件替换上次持久化还的文件。整个过程中,主进程是不进行任何 IO 操作,这就确保了极高的性能,如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感。RDB 的缺点是最后一次持久化后的数据可能丢失

2.当Redis的主从备份的时候,也会触发BGSAVE,当从机连接上主机后,会向主机发送sync命令来开始一次复制操作,这个时候,主机会开始进行一次BGSAVE操作,并在BGSAVE操作结束后,向从机发送快照数据实现同步。

3.当关闭redis服务器的时候,执行shutdown命令,此时触发的是SAVE命令。

关注51码农网,程序员学习打卡社群:www.51manong.com
微信公众号: