Redis持久化存储详解( 二 )


AOF持久化存储
AOF持久化存储是什么
AOF持久化存储便是以日志的形式将redis存储在缓冲区中的数据写入到磁盘中 。简而言之 , 就是记录redis的操作日志 , 将redis执行过的命令记录下载 , 当我们需要数据恢复时 , redis去重新执行一次日志文件中的命令.
如何配置持久化存储
// 将no改为yes , 控制aof开启与否appendonly no// 控制aof文件名称 , 存储的目录便是dir配置项appendfilename "appendonly.aof"// 三种备份策略(三者只需要开启以一个即可)# appendfsync always // 命令写入立即写入磁盘appendfsync everysec // 每秒实现文件的同步 , 写入磁盘# appendfsync no // 随机进行文件的同步,同步操作则交给操作系统来负责 , 通常时间是最长30s
AOF持久化存储实现原理
aof日志追加方式实现持久化存储 , 需要经历如下四个过程.命令写入->文件同步->文件重写->文件重载
1.redis命令写入 , 此时会将redis命令写入换从区. 2.缓冲区中数据根据备份策略实现写入日志文件. 3.当aof的文件越来越庞大 , 会根据我们的配置策略来实现aof的重写 , 实现文件的压缩 , 减少体积. 4.当redis重新启动时 , 在去重写加载aof文件 , 达到数据恢复的目的.
命令写入
命令写入主要是将文件执行过的命令写入到日志文件中.并且日志文件尊徐文本协议格式 , 下面示例代码便是aof日志文件中存储的内容格式.
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
aof采用的是文本协议格式 。主要是原因根据资料提示 , 可以能使由于如下原因. 1.文本协议的兼容性好.前面我们提及到了rdb文件是进行二进制加密 , 可能不同版本之间会出现不兼容的情况 , 采用文本协议可以加避免该问题 。同时文本协议也可以减少跨平台使用所带来的诸多问题. 2.可读性强.由于aof是将命令写入文件中 , 我们可以直接查看命令内容 , 同时也可以修改日志文件内容. 3.开启aof后 , 所有的文件文件都包含追加操作 , 直接采用文本协议 , 减少二次开销(这一点 , 个人不是很理解.因为我们的aof是保存的是命令 , 当我们再次去加载的时候 , 会去执行一次里面的命令 , 当文件大的时候应该是比较耗时的吧 。如果没有做好文件重写策略 , 大量重复无效的命令执行 , 对于二进制加密的rdb格式 , 不需要再去转换 , 这一点确实可以减少二次开销).
文件写入
文件写入是将缓冲区的命令写入到文件中.文件写入的策略有如下三种方式
配置项
配置说明
命令写入到缓冲区中之后立即调用系统的fsync操作同步到aof文件中 , fsync完成后线程返回.
命令写入到缓冲区后每隔一秒调用系统的write操作 , write完成后线程返回.
no
命令写入缓冲区后调用系统write操作 , 不对aof文件做fsync同步 , 同步硬盘操作由系统操作完成 , 时间一般最长为30s.
系统调用write和fsync说明:
·write操作会触发延迟写(write) 机制 。Linux在内核提供页缓冲区用来提高硬盘IO性能 。write操作在写入系统缓冲区后直接返回 。同步硬盘操作依赖于系统调度机制 ,  例如: 缓冲区页空间写满或达到特定时间周期 。同步文件之前 ,  如果此时系统故障宕机 ,  缓冲区内数据将丢失.