持久化

Redis内存数据持久化的两种方式:RDB和AOF。

RDB

RDB,采用快照(snapshot)的方式完成。进行快照的条件是,时间和改动的键的个数。

RDB的过程大致是:
(1) redis使用fork函数复制一份当前进程(父进程)的副本(子进程)。在执行fork的时候操作系统会使用"写时复制"copy-on-write的策略,即fork函数调用的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork一刻的内存数据。 (2) 父进程继续接受客户端的命令,子进程开始讲内存中的数据写入到硬盘中的临时文件。 (3) 当子进程写入临时文件完成后,使用该文件替换掉旧的RDB文件,至此一次RDB快照操作就完成了。

使用RDB的一个问题是,当redis异常退出后,最后一次快照之后的数据都会丢失,这时可以考虑AOF方式,如下:

AOF

AOF(append only file)开启后,每一条会更改redis中数据的命令都会持久化,redis会该命令写入到硬盘中的AOF文件。但是硬盘的写入也有缓存,操作系统默认每30秒执行一次同步操作,以将硬盘缓存的内容真正写入硬盘。为了避免这30秒的数据丢失,redis可以通过appendfsync参数设置同步的时机:

# appendfsync always
appendfsync eversec
# appendfsync no

默认采用 everysec,即每秒执行一次同步操作;always表示每次执行写入都会执行同步,这时最安全也是最慢的方式;no则是不主动同步,由操作系统自己去完成。一般情况下选择everysec就可以既兼顾了性能又保证了安全。