因为redis是将数据保存在内存中行操作的,一旦服务器进程退出,其中的数据就会消失不见了。如何解决这样的问题,我们可以将内存中的数据保存在磁盘中,这样就能避免数据意外丢失了。
Redis提供RDB持久化功能,将redis存在内存中的数据保存在磁盘中去。
- RDB持久化可以手动完成,也可以根据服务器配置选项定期执行
- 经过持久化保存后,会形成一个经过压缩的二进制文件,RDB文件。也可以使用RDB文件还原数据库的状态。
- RDB的创建
使用两个命令可以生成RDB文件,SAVE和BGSAVE
两个命令的区别是
- SAVE命令会阻塞redis服务进程,直到RDB文件创建完成,很明显的缺点就是,在这期间,服务器不能处理任何命令请求。
- BGSAVE会创建一个子进程,子进程会帮我们创建RDB文件,父进程(服务进程)会继续处理请求。
- RDB的载入
- redis服务进程启动的时候就会自动载入RDB,无需人为干预(也没有特定的命令让redis载入RDB)
载入时,会先判断数据库是否AOF持久化。
AOF持久化也是将数据保存在磁盘中,但保存的数据不是真实的数据,而是redis执行命令。
注意:
- 在执行BGSAVE期间,不能执行SAVE命令,即不能同时执行两个命令,目的是避免父进程和子进程同时执行两个rdbSave调用,防止产生竞争条件。也不能同时执行两个BGSAVE命令。
- 服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止。
是否可以自动RDB持久化?当然
- 自动间隔性保存,BGSAVE是创建子进程进行保存得,那么我们可以配置服务器的save选项,让服务器每隔一段时间进行自动BGSAVE保存。
- 设置多个save保存条件,满足其一就可以执行BGSAVE。如下列表(saveparams数组)是保存选项
saveParam[0] | saveParam[1] | saveParam[2] |
---|---|---|
900seconds | 300seconds | 60seconds |
1 changes | 10 changes | 10000changes |
- 在900秒内,对数据库至少修改了1次
- 在300秒内,对数据库至少修改了10次
- 在60秒内,对数据库至少修改了10000次
只要满足其一,就会执行BGSAVE命令
Redis的服务器周期性操作函数serverCron默认每隔100毫秒执行一次,对数据库进行维护,其中一项工作就是检查save选项所设置的保存条件是否已经满足,如果满足就会执行BGSAVE命令