redis一个特点就是持久化,并且持久化的时候基本还不会对效率产生太大的影响。
redis的持久化方式有两种,分别是:RDB和AOF。RDB看起来可能不知所云,其实简单的说就是俗称的快照。AOF呢基本就是bin log的模式。
用比较易懂的方式描述了两种持久化方式,那么下面详细的说一下两种方式的优缺点。
AOF:
AOF这种方式,会保存服务器上所有的写操作命令,并且在服务器启动的时候,将数据进行还原。写入文件的时候会按照redis的特有协议来进行写入。
而且还会不定期重写,来保证文件的不会变的过大。
AOF的策略也有很多种,比如不进行sync,比如每秒进行一次sync,或者每次写入都进行一次sync。aof进行sync的时候,进行aof是一种增量写入的方式,
即便是服务宕机的时候,也只是丢失一秒钟的数据,还是可以接受的。当aof的文件过大的时候,会对其进行重写,重写完成,redis会将写入文件,由老版切换
到新版。
AOF进行数据还原的时候,相对于RDB还是较慢的。效率方面,根据不同的aof策略,相对于rdb还是有一定的影响,当关闭aof的时候,能与rdb一样快。
AOF的运作方式:
- Redis 执行 fork() ,现在同时拥有父进程和子进程。
- 子进程开始将新 AOF 文件的内容写入到临时文件。
- 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾: 这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
- 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
- 搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。
RDB:
RDB这种方式,为快照的方式。会根据save的配置来生成快照,比如多少时间内有多少个key发生变化。每次保存rdb的时候,都会fork出子进程,来进行
这些操作。当数据重要性比较高,要通过这种方式来保证数据的完整性,还是相对比较难的。所以这个方式非常适用的方式是进行数据备份,而且通过dump的
文件来进行数据恢复,还会比AOF恢复的速度快。
可以通过命令行来进行dump,SAVE ,BGSAVE都是可以的。
RDB的运作方式:
-
- Redis 调用 fork() ,同时拥有父进程和子进程。
- 子进程将数据集写入到一个临时 RDB 文件中。
- 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。