Redis持久化的两种方式
- 快照(snapshotting) 方式(RDB):
默认持久化方式,将内存中的数据以快照的方式写入到二进制文件中,文件名为dump.rdb,可以修改
save 100 1:如果100秒内超过1个key被修改,则发起快照保存
步骤:
1.redis调用fork,包含了子进程和父进程
2.父进程处理client请求,子进程负责将内存内容写入到临时文件
3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出(每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步变更数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘 io 操作,可能会严重影响性能)
- AOF(Append-only file)方式:
该模式下,redis会将每个收到的写命令通过write函数追加到文件中(appendonly.aof),当 redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容
由于 os 会在内核中缓存 write 做的修改,所以可能不是立即写到磁盘上。这样 aof 方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis 我们想要通过 fsync 函数强制 os 写入到磁盘的时机。
有三种方式如下(默认是:每秒 fsync 一次)
appendonly yes //启用 aof 持久化方式
appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
appendfsync no //完全依赖 os,性能最好,持久化没保证
问题:持久化文件会越来越大,使用bgrewriteaof命令来压缩持久化文件。
参考链接: