一、AOF持久化的配置


配置文件redis.conf,AOF持久化默认是关闭的,默认是打开RDB持久化

appendonly yes



二、工作流程:


打开AOF持久化机制之后,redis每次接收到一条写命令,就会写入日志文件中,当然是先写入os cache的,然后每隔一定时间再fsync一下



可以配置AOF的fsync策略,有三种策略可以选择,

  • always: 每次写入一条数据,立即将这个数据对应的写日志fsync到磁盘上去,优点是保证数据都不会丢,但是性能非常非常差,吞吐量很低
  • everysec: 每秒将os cache中的数据fsync到磁盘,生产基本就用这个,性能很高,QPS还是可以上万的
  • no: 仅仅redis只负责将数据写入os cache,后面os自己会时不时有自己的策略将数据刷入磁盘,这就不可控了



三、AOF持久化的数据恢复实验


  1. 先仅仅打开RDB,写入一些数据,然后kill -9杀掉redis进程,接着重启redis,发现数据没了,因为RDB快照还没生成
  2. 打开AOF的开关,启用AOF持久化
  3. 写入一些数据,我们会发现AOF文件中有了对应的写入命令
  4. kill -9杀掉redis进程,重新启动redis进程,发现数据被恢复回来了,就是从AOF文件中恢复回来的。
  5. redis进程启动的时候,直接就会从appendonly.aof中加载所有的日志,把内存中的数据恢复回来

总结:所以在实际生产环境中必须开启AOF避免数据丢失。而RDB主要做冷备用的。



四、AOF rewrite


定义

redis存在被用户删除,自动过期删除,淘汰策略等等。但redis会不断将写命令写入到同一个AOF,特别是频繁修改数据,AOF文件就会不断的膨胀变大

所以AOF会自动在后台每隔一定时间做rewrite操作

配置

在redis.conf中,可以配置rewrite策略

#当前 AOF 文件大小相对于上次重写完的 AOF  size的增长比例,设置为0时不开启
auto-aof-rewrite-percentage 100
#当前 AOF 文件大小超过最小重写尺寸
auto-aof-rewrite-min-size 64mb

表示当最小rewrite的size是64mb,这是前提。当前AOF文件大小超过上一次AOF100%,则增长比例为100%时,自动触发rewrite机制。

  • 举个栗子:

上一次AOF rewrite后size是128mb,然后redis继续写AOF的日志,

但size达到256mb的时候,超过了之前的100%,并且256mb > 64mb,就会去触发一次rewrite

流程:

(1)redis fork一个子进程

(2)子进程基于当前内存中的数据,构建日志,开始往一个新的临时的AOF文件中写入日志

(3)redis主进程,接收到client新的写操作之后,在内存中写入日志,同时新的日志也继续写入旧的AOF文件

(4)子进程写完新的日志文件之后,redis主进程将内存中的新日志再次追加到新的AOF文件中

(5)用新的日志文件替换掉旧的日志文件



五、AOF破损文件的修复


如果redis在append数据到AOF文件时,机器宕机了,可能会导致AOF文件破损。可以使用下面的命令修复

redis-check-aof --fix



六、AOF和RDB同时工作


  1. 如果RDB在执行snapshotting操作,那么redis不会执行AOF rewrite; 如果redis在执行AOF rewrite,那么就不会执行RDB snapshotting
  2. 如果RDB在执行snapshotting,此时用户执行BGREWRITEAOF命令,那么等RDB快照生成之后,才会去执行AOF rewrite
  3. 同时有RDB snapshot文件和AOF日志文件,那么redis重启的时候,会优先使用AOF进行数据恢复,因为其中的日志更完整

小tip:QPS,每秒钟的请求数量

mysql -> 内存策略,大量磁盘,QPS到多少,一两k。

redis -> 内存,磁盘持久化,QPS到多少,单机,一般来说,上万QPS没问题




hi~我是Mirror,一个为了自由安逸的未来而不断前进的的程序员。

如果你觉得文章对你有一点点帮助,一个小小赞,便是对我的认可,如果有不足之处,也欢迎各位指正。

最新文章

  1. JSONKit在项目中使用设置(ARC与方法更新)
  2. Hive的API的说明
  3. JavaWeb学习总结-07 Filter 学习和使用
  4. [Mongodb]删除指定字段
  5. 复制 replication 新增表 add new article
  6. python基础语法(2)
  7. RotatingDoughnut
  8. [转贴]gsoap使用心得!
  9. 【懒人有道】在asp.net core中实现程序集注入
  10. hdu 5305 friends
  11. postman(九):postman接口测试脚本集成到jenkins
  12. BUAA_OO第二单元作业总结——多线程
  13. numpy.convolve函数用法
  14. BZOJ2821 作诗(Poetize) 主席树 bitset
  15. JMD Handy Baby 2 to Decode & Adding New BMW 525 ID46 Key
  16. [转载]基于UML的需求分析和系统设计(完整案例和UML图形演示)
  17. pycharm中查找替换妙用
  18. Atitit 图像处理类库安装与安装模式的前世今生与未来大趋势attilax总结.docx
  19. 核心重点lxml
  20. .net正则查询

热门文章

  1. Python学习手册第4版 中文PDF版|网盘下载内附地址
  2. 7.9 NOI模拟赛 C.走路 背包 dp 特异性
  3. 牛客练习赛60 D 斩杀线计算大师
  4. RocketMQ文章
  5. 一文打尽Java抽象类和接口的相关问题
  6. 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式
  7. 创建shell脚本文件
  8. java List接口二
  9. socket传输图片用shutdownoutput()之后无法继续传输数据
  10. G4560 HD610安装黑苹果Hakintosh