Redis的持久化存储
Redis是一种高级key-value数据库。支持字符串、哈希表、列表、集合、有序集合等数据类型。
Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的。所以,我们需要将内存中的数据持久化。
为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中以某种方式同步到硬盘中,当redis重启后,可以从磁盘中恢复数据,这一过程就是持久化。
Redis中数据存储模式有2种: cache-only,persistence
- cache-only即只做为“缓存”服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在“数据恢复”的手段,是一种安全性低/效率高/容易扩展的方式;
- persistence即为内存中的数据持久备份到磁盘文件,在服务重启后可以恢复,此模式下数据相对安全。
对于persistence持久化存储,Redis提供了两种持久化方法:
- 基于快照形式的RDB(Redis DataBase)
- 基于磁盘的AOF(Append-only file)
1、RDB持久化
(1)RDB概述
RDB是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
原理是将Reids在内存中的数据库记录定时写到磁盘上。
(2)RDB的优点
- 使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能 。
- 相比于AOF机制,RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快,RDB的启动效率会更高。
- 系统出现灾难性故障,非常容易进行恢复。
(3)RDB的缺点
- RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候。
- RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
2、AOF持久化
(1)AOF概述
AOF将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。
原理是将Reids的操作日志以追加的方式写入文件。
(2)AOF的优点
- AOF可以带来更高的数据安全性,即数据持久性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。
- AOF的特性决定了它相对比较安全,可以将数据更加及时的同步到文件中,如果你期望数据更少的丢失,那么可以采用AOF模式;
- 可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;
- AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。
- 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。
- 如果日志写入不完整,支持redis-check-aof来进行日志修复;
- 如果日志过大,Redis可以自动启用rewrite机制。
- AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。
(3)AOF的缺点
- AOF文件比RDB文件大,且恢复速度慢。
- AOF是文件操作,对于变更操作比较密集的server,那么必将造成磁盘IO的负荷加重;
- AOF文件会不断增大,它的大小直接影响“故障恢复”的时间。
- 由于同步策略的不同,AOF在运行效率上往往会慢于RDB。