Redis 如同其余的存储组件同样,提供了两类持久化方式:快照,和全量追加日志。html
在默认状况下, Redis 将数据库快照保存在名字为dump.rdb
的二进制文件中。
你能够对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被知足时, 自动保存一次数据集。
你也能够经过调用 SAVE
或者 BGSAVE
, 手动让 Redis 进行数据集保存操做。
这种持久化方式被称为快照 snapshotting
.redis
SAVE
:暂停服务,写dump.rdb,好比中止时执行BGSAVE
:经过fork
系统调用建立子进程写 dump.rdb# 配置写入策略(针对bgsave): save 900 1 #(900秒内至少1个key被写) save 300 10 #(300秒内至少10个key被写) save 60 10000 #(60秒内至少1000个key被写) # 若是不须要RDB,能够设置: save "" # 设置 rdb 文件名称 和 存储目录 dbfilename dump.rdb dir /var/lib/redis/6379
快照功能并非很是耐久(durable): 若是 Redis 由于某些缘由而形成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。
从 1.1 版本开始, Redis 增长了一种彻底耐久的持久化方式: AOF 持久化。shell
appendonly yes #(开启AOF) appendfilename "appendonly.aof"
每当 Redis 执行一个改变数据集的命令时(好比 SET), 这个命令就会被追加到 AOF 文件的末尾。
这样的话, 当 Redis 从新启时, 程序就能够经过从新执行 AOF 文件中的命令来达到重建数据集的目的。数据库
你能够配置 Redis 多久才将数据 fsync 到磁盘一次。有三种方式:安全
# fsync同步刷盘策略 # appendfsync always #(马上同步刷盘,最慢,也最安全) appendfsync everysec #(每秒才触发一次同步刷盘,推荐) # appendfsync no # (不采用同步刷盘,最快,相对不安全)
由于 AOF 的运做方式是不断地将命令追加到文件的末尾, 因此随着写入命令的不断增长, AOF 文件的体积也会变得愈来愈大。
举个例子, 若是你对一个计数器调用了 100 次 INCR , 那么仅仅是为了保存这个计数器的当前值, AOF 文件就须要使用 100 条记录(entry)。
然而在实际上, 只使用一条 SET 命令已经足以保存计数器的当前值了, 其他 99 条记录实际上都是多余的。服务器
为了处理这种状况, Redis 支持一种有趣的特性: 能够在不打断服务客户端的状况下, 对 AOF 文件进行重建(rebuild)。
执行 BGREWRITEAOF
命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。app
# 配置:AOF文件每次增加指定大小的百分比后,就会触发BGREWRITEAOF auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
从 Redis 4.0 开始,AOF重写逻辑变更了:ui
fork
写入 aof文件的头部这样的方式,AOF是一个混合体,利用了RDB的快,利用了日志的全量,使得 Redis 持久化更加安全和完善。spa
@SvenAugustus ( https://my.oschina.net/langxS...