redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。
redis吃吃两种持久化方式:
1.snapshotting(快照)也是默认方式。
2.Append-only file(缩写aof)的方式。
snapshotting:
快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动快照持久化的方式。我们可以配置redis在n秒内如果超过m个key修改就自动做快照。
save 900 1#900秒内如果超过1个key被修改,则发起快照保存
save 300 1#300秒内如果超过10个key被修改,则发起快照保存
save 60 10000
aof 方式:
由于快照是按照一定时间间隔做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上,这样aof方式的持久化也还是有可能会丢失部分修改。
可以通过配置文件告诉redis我们想要fsync函数强制os写入磁盘的时机。
appendonly yes //启动aof持久化方式
#appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全持久化。
appendfsync everysec//每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中。
#appendfsync no//完全依赖os,性能最好,持久化没保证。