Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。Redis支持两种持久化方式:
一、snapshotting(快照)方式
快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。我们可以配置redis在n秒内如果超过若干个key被修改就自动做快照持久保存。
在约87行,有默认的快照策略(指定在多长时间内,有多少次更新操作,就将数据同步到数据快照文件,可以多个条件配合,客户端也可以使用 save 命令强制立即保存快照):
save 900 1 # 在900秒内有1个key更新,就写入快照文件
save 300 10 # 在300秒内有10个key更新,就写入快照文件
save 60 10000 # 在60秒内有10000个key更新,就写入快照文件
# 是否采用LZF方式压缩存储快照文件?
# 默认采用压缩存储(yes),压缩存储会更多的耗费CPU资源;
# 如果你想节省一些CPU资源,可以设置为不采用压缩存储(no),但这样会导致快照文件体积变的很大(利弊请自己权衡);
rdbcompression yes # 默认
# 快照文件
dbfilename dump.rdb # 默认文件名
# dbfilename /usr/local/redis/dbbak/dump.rdb # 如果需要也可以显式指定存储位置,这样的话dir配置选项会无效了
# 指定本地数据库存放目录(快照文件和aof文件存储目录)
dir ./ # 默认数据库快照文件、aof文件存储目录是当前目录
dir /usr/local/redis/dbbak/ # 也可以显式指定快照文件、aof文件的存储目录
二、append-only file(缩写aof)方式
由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行aof文件中保存的“增删改”命令,而在内存中重建整个数据库内容。
由于OS会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。解决方式是可以通过配置文件告诉redis我们想要通过fsync函数强制OS写入到磁盘的时机。
# aof 总开关
在约283行找到 appendonly no 默认是关闭状态,如需将其启用改为:
appendonly yes
# aof文件存储路径
# appendfilename appendonly.aof # 默认文件名
# appendfilename /usr/local/redis/dbbak/appendonly.aof # 如果需要指定路径可显式指定修改,这样的话dir配置选项会无效了
# aof 方式 在约309行
# appendfsync always # 收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec # 每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中(默认,推荐)
# appendfsync no # 完全依赖os,性能最好,持久化没保证