Redis RDB AOF持久化方式

 

RDB Snapshotredis

    快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。能够经过配置设置自动作快照持久 化的方式。咱们能够配置redis在n秒内若是超过m个key被修改就自动作快照,下面是默认的快照保存配置数据库

save 900 1  #900秒内若是超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000缓存

 

快照保存过程app

1.redis调用fork,如今有了子进程和父进程。函数

2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。因为os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面建立副本,而不是写共享的页面。因此子进程的地址空间内的数据是fork时刻整个数据库的一个快照。性能

3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,而后子进程退出。线程

 

    client 也可使用save或者bgsave命令通知redis作一次快照持久化。save操做是在主线程中保存快照的,因为redis是用一个主线程来处理全部 client的请求,这种方式会阻塞全部client请求。因此不推荐使用。另外一点须要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不 是增量的只同步脏数据。若是数据量大的话,并且写操做比较多,必然会引发大量的磁盘io操做,可能会严重影响性能。进程

    另外因为快照方式是在必定间隔时间作一次的,因此若是redis意外down掉的话,就会丢失最后一次快照后的全部修改。若是应用要求不能丢失任何修改的话,能够采用aof持久化方式。内存

 

 

AOF Append-only file同步

 

    aof 比快照方式有更好的持久化性,是因为在使用aof持久化方式时,redis会将每个收到的写命令都经过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会经过从新执行文件中保存的写命令来在内存中重建整个数据库的内容。固然因为os会在内核中缓存 write作的修改,因此可能不是当即写到磁盘上。这样aof方式的持久化也仍是有可能会丢失部分修改。不过咱们能够经过配置文件告诉redis咱们想要 经过fsync函数强制os写入到磁盘的时机。有三种方式以下(默认是:每秒fsync一次)

appendonly yes              //启用aof持久化方式
# appendfsync always      //每次收到写命令就当即强制写入磁盘,最慢的,可是保证彻底的持久化,不推荐使用
appendfsync everysec     //每秒钟强制写入磁盘一次,在性能和持久化方面作了很好的折中,推荐
# appendfsync no    //彻底依赖os,性能最好,持久化没保证

 

 

AOF优缺点

优势:

    比快照方式可靠,默认每秒同步一次,意味着最多丢失一秒的数据

缺点:

    相同数据集大小,AOF文件会比快照文件大、

 

压缩AOF文件

    Redis能够自动压缩(也能够叫重写)AOF文件,用户也能够经过BGREWRITEAOF命令来压缩AOF文件。这里的压缩,不是平时说的压缩的意思,是指建立一个新的文件来替换旧的文件,两个文件保存的数据状态彻底一致。若是在本地手动执行BGREWRITEAOF命令,能够看到会生成一个temp-rewriteaof-*.aof的临时文件,在结束后替换appendonly.aof文件,从而减少appendonly.aof文件的大小

    aof 的方式也同时带来了另外一个问题。持久化文件会变的愈来愈大。例如咱们调用incr test命令100次,文件中必须保存所有的100条命令,其实有99条都是多余的。由于要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照相似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。

 

 

具体过程

 

1. redis调用fork ,如今有父子两个进程
2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证若是子进程重写失败的话并不会出问题。
4.当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。而后父进程把缓存的写命令也写入到临时文件。
5.如今父进程可使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

 

须要注意

    重写aof文件的操做,并无读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点相似。

相关文章
相关标签/搜索