redis持久化机制

Posted by Clear Blog on August 28, 2017

redis支持小量数据落地功能,但由于支持多种数据结构, 导致持久化到硬盘是一个难题。 我简单的介绍下常用的两种持久化方式:

定时快照方式(snapshot):

该持久化方式实际是在Redis内部一个定时器事件, 每隔固定时间去检查当前数据发生的改变次数与时间是否满足配置的持久化触发的条件, 如果满足则 通过操作系统fork调用来创建出一个子进程, 这个子进程默认会与父进程共享相同的地址空间, 这时就可以通过子进程来遍历整个内存来进行存储操作, 而主进 程则仍然可以提供服务, 当有写入时由操作系统按照内存页(page)为单位来进行copy-on-write保证父子进程之间不会互相影响。 该持久化的主要缺点是定时快照只是代表一段时间内的内存映像, 所以系统重启会丢失上次快照与重启之间所有的数据。

基于语句追加方式(aof):

aof方式实际类似mysql的基于语句的binlog方式, 即每条会使Redis内存数据发生改变的命令都会追加到一个log文件中, 也就是说这个log文件就是Redis的持久化数据。 aof的方式的主要缺点是追加log文件可能导致体积过大, 当系统重启恢复数据时如果是aof的方式则加载数据会非常慢, 几十G的数据可能需要几小 时才能加载完, 当然这个耗时并不是因为磁盘文件读取速度慢, 而是由于读取的所有命令都要在内存中执行一遍。 另外由于每条命令都要写log,所以使用aof的方式,Redis的读写性能也会有所下降。