Redis 支持两种持久化方式:RDB(Redis Database)和 AOF(Append Only File)。
在使用 Redis 时,我们可以根据实际需求选择不同的持久化方式。如果对数据的实时性要求不高,可以选择 RDB 持久化;如果需要保证数据的完整性和可恢复性,可以选择 AOF 持久化。另外,Redis 还支持 RDB 和 AOF 混合持久化的方式,可以兼顾两种持久化方式的优点。
具体的:
RDB
通过操作系统的多进程写时复制(COW)实现快照持久化: 1)持久化时调用fork()产生一个子进程,快照持久化交给子进程处理(子进程刚产生时,和父进程共享内存中的代码段和数据段,在进程分离的一瞬间,内存几乎无增长); 2)子进程做持久化不会修改内存中数据,但父进程会修改,这会导致数据段页面分离(当父进程修改某页数据时,该页面会被复制一份分离出来;子进程页面没有变化);同时由于冷数据占比高,所以被分离出来的页面很少。
AOF
先执行指令再写日志 1)由于AOF文件会比较大,为了避免写入无效指令(错误指令),必须先做指令检查 (如何检查,只能先执行了。因为语法级别检查并不能保证指令的有效性,比如删除一 个不存在的key。而MySQL这种是因为它本身就维护了所有的表的信息,所以可以语法 检查后过滤掉大部分无效指令直接记录日志,然后再执行。) 2)Redis本身定位内存数据库,速度是第一要素。AOF是个IO操作,会拖性能后腿。 Redis允许自定义AOF同步频率策略:Always(最安全,也存在丢失数据的情况,一个 事件循环的频率同步一次)、Everysec(常用,每秒同步一次)、No(最不安全,让操 作系统决定刷盘频率) 来满足不同的数据安全需求。