原文链接:http://www.cnblogs.com/tdws/p/5754706.html

Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDBAOF作用原理,剩下的就是根据实际情况来制定合适的策略了,再复杂一点,也就是定制一个高可用的,数据安全的策略了。

RDB:快照形式,是把内存的当前状态直接保存在RDB中,保存策略是隔一段时间保存一下

AOF:命令行形式,执行一条命令,直接把命令存到一个aof文件中,保存策略是默认一秒钟保存一下命令,对数据的安全性也好,性能要差一点

    默认开启的是RDB,AOF是不开启的

先来看RDB持久化方式:

在RDB方式下,你有两种选择,一种是手动执行持久化数据命令来让redis进行一次数据快照,另一种则是根据你所配置的配置文件 的 策略,达到策略的某些条件时来自动持久化数据。而手动执行持久化命令,你依然有两种选择,那就是save命令和bgsave命令。

save操作在Redis主线程中工作,因此会阻塞其他请求操作,应该避免使用。

(默认下,持久化到dump.rdb文件,并且在redis重启后,自动读取其中文件,据悉,通常情况下一千万的字符串类型键,1GB的快照文件,同步到内存中的 时间是20-30秒

bgSave则是调用Fork,产生子进程,父进程继续处理请求。子进程将数据写入临时文件,并在写完后,替换原有的.rdb文件。Fork发生时,父子进程内存共享,所以为了不影响子进程做数据快照,在这期间修改的数据,将会被复制一份,而不进共享内存。所以说,RDB所持久化的数据,是Fork发生时的数据。在这样的条件下进行持久化数据,如果因为某些情况宕机,则会丢失一段时间的数据。如果你的实际情况对数据丢失没那么敏感,丢失的也可以从传统数据库中获取或者说丢失部分也无所谓,那么你可以选择RDB持久化方式。

再谈一下配置文件的策略,实际上它和bgsave命令持久化原理是相同的。

这是配置文件默认的策略,他们之间的关系是或,每隔900秒,在这期间变化了至少一个键值,做快照。或者每三百秒,变化了十个键值做快照。或者每六十秒,变化了至少一万个键值,做快照。

下面再来说一说AOF快照方式:

AOF,append only file。

配置文件中的appendonly修改为yes。开启AOF持久化后,你所执行的每一条指令,都会被记录到appendonly.aof文件中。但事实上,并不会立即将命令写入到硬盘文件中,而是写入到硬盘缓存,在接下来的策略中,配置多久来从硬盘缓存写入到硬盘文件。所以在一定程度一定条件下,还是会有数据丢失,不过你可以大大减少数据损失。

这里是配置AOF持久化的策略。redis默认使用everysec,就是说每秒持久化一次,而always则是每次操作都会立即写入aof文件中。而no则是不主动进行同步操作,是默认30s一次。当然always一定是效率最低的,个人认为everysec就够用了,数据安全性能又高。

Redis也允许我们同时使用两种方式,再重启redis后会从aof中恢复数据,因为aofrdb数据损失小嘛。

区别和深入理解:

RDB每次进行快照方式会重新记录整个数据集的所有信息。RDB在恢复数据时更快,可以最大化redis性能,子进程对父进程无任何性能影响。

AOF有序的记录了redis的命令操作。意外情况下数据丢失甚少。他不断地对aof文件添加操作日志记录,你可能会说,这样的文件得多么庞大呀。是的,的确会变得庞大,但redis会有优化的策略,比如你对一个key1键的操作,set key1 001 ,  set key1 002, set key1 003。那优化的结果就是将前两条去掉咯,那具体优化的配置在配置文件中对应的是

前者是指超过上一次aof重写aof文件大小的百分之多少,会再次优化,如果没有重写过,则以启动时为主。后者是限制了允许重写的最小aof文件大小。bgrewriteaof命令是手动重写命令,会fork子进程,在临时文件中重建数据库状态,对原aof无任何影响,当重建旧的状态后,也会把fork发生后的一段时间内的数据一并追加到临时文件,最后替换原有aof文件,新的命令继续向新的aof文件中追加。

最新文章

  1. Day 1:学习Windows Phone 使用 SQLite
  2. block的使用
  3. AJAX-----09iframe模拟ajax文件上传效果原理1
  4. 二元查找树转变成排序的双向链表之C#算法实现
  5. [ORACLE错误]ORA-00054:resource busy and acquire with nowait specified解决方法
  6. ITK 3.20.1 VS2010 Configuration 配置
  7. 市委组织部考核项目——利用EasyUi中可编辑的DataGrid控件对多行数据进行编辑并提交
  8. windows service的作成
  9. TortoiseSVN文件夹图标不显示的解决方法
  10. 超过130个你需要了解的vim命令
  11. HDU ACM 4578 Transformation->段树-间隔的变化
  12. Linux改变语言设置的命令
  13. 如何处理导出的csv无法查看身份证后三位的情况?
  14. arm寄存器
  15. form表单图片上传
  16. 如何使用nodejs快速搭建本地服务器
  17. 基于webpack的react脚手架
  18. Python学习笔记第十九周
  19. 第7章 "敏捷+"项目管理
  20. 解决Win10无法安装.Net Framework 3.5,错误代码0x800F081F

热门文章

  1. android ——通知管理
  2. ASP.NET Core 框架本质学习
  3. 关于修改主机名和ssh免密登录
  4. springboot集成redis实现消息发布订阅模式-双通道(跨多服务器)
  5. 虚拟机安装CentOS的简短教程
  6. (十四)c#Winform自定义控件-键盘(一)
  7. 解决OneNote同步出错
  8. 十分钟入门流处理框架Flink --实时报表场景的应用
  9. Tomcat源码分析 (七)----- Tomcat 启动过程(二)
  10. c++的构造和析构