redis的数据是缓存在内存中的,一旦redis服务器发生故障(或者断电),内存中的数据就会消失,但是redis是有持久化机制的,redis会把自己缓存的数据备份到磁盘上,当重新启动redis服务器之后,redis就会从磁盘中恢复之前的数据。
redis共有两种持久化机制:RDB和AOF。
一、RDB持久化机制
RDB持久化机制是每隔一段时间就将当前时间点的redis数据集的快照进行备份,时间间隔可以设置。
完成rdb快照文件的生成之后,就替换之前的旧的快照文件dump.rdb,每次生成一个新的快照,都会覆盖之前的老快照
redis的持久化功能是可以关闭的,同时一旦将redis服务器关闭或者宕机,所有缓存的数据也会随之消失。
可以同时使用RDB和AOF两种持久化机制。
二、RDB的优点与缺点
优点:
每隔一段时间,全量备份缓存数据。以单独文件的形式进行备份,而且可以简单的恢复不同版本的数据,比如我们以备份的时间点对备份文件进行命名,这样就形成了不同版本的备份数据,在恢复的时候只要选中要恢复的版本就可以。
非常适合做灾备(灾难恢复),可以远程传输备份的文件。一个互联网企业一旦做大,就一定会有单独的数据中心,这个时候我们可以把redis持久化的数据文件远程传输到数据中心,在本地服务器恢复后从远处的数据中心恢复数据。
redis在进行备份的时候,主进程会生成子进程进行数据备份,在子进程进行数据备份的时候,主进程不会有任何IO操作(不会写入修改或删除),保证备份数据的完整性。
相对于AOF来说,可以更快的恢复更大的数据集文件。
缺点:
RDB每隔一段时间就会进行备份,如果在备份的时候服务器出现问题,那么最后一次要备份的文件就会丢失,也就是只能恢复之前备份的版本。如果我们可以接收这种数据的非完整性(最后一次数据丢失),我们就可以使用这种方法。
子进程在备份数据的时候会占用和父进程一模一样的资源,在备份的数据集比较大的时候,会增大CPU的损耗,如果服务器性能比较高的话,这种损耗可以不计。
无法做到实时备份,因为RDB是在(间隔的)某一时间点进行全量备份。
三、RDB持久化配置
# 每900秒钟如果有超过1个key发生变化,则基于现在缓存中的数据进行一个dump.rdb快照,其他save同理
# 测试:写入几条数据,等待5秒钟,会发现自动进行了一次dump rdb快照,在dump.rdb中发现了刚插入的数
# 据
save 900 1
save 300 10
save 60 10000
# 在保存过程中发生错误,停止写操作:yes:如果save过程出错,则停止写操作 no:可能造成数据不一致
stop-writes-on-bgsave-error yes
# 压缩rdb文件:yes:开启rdb压缩模式 no:关闭,会节约cpu损耗,但是文件会大,道理同nginx
rdbcompression yes
# 在保存和加载rdb文件时,对数据进行校验
# yes:使用CRC64算法校验对rdb进行数据校验,有10%性能损耗 no:不校验
rdbchecksum yes
# rdb文件名
dbfilename dump.rdb
# rdb文件的保存目录,一般在安装时的配置就会写上自己的路径
dir /usr/local/redis/working