redis的两种持久化的机制,你真的了解么?
redis提供了两种持久化的机制 RDB和AOF机制
RDB(redis Database):RDB保存某一个时间点之前的快照数据。
AOF(Append-Only File):指所有的命令行记录以redis命令请求协议的格式完全持久化存储保存为AOF文件
混合持久化(4.0版本以后):指进行AOF重写时子进程将当前时间点的数据快照保存为RDB文件格式,而后将父进程累计命令保存为AOF格式。
RDB快照有两种触发方式
1:为通过配置参数,如下:
通过一定的时间周日内看,命令执行的个数,超过阈值立即执行快照生成
save 900 1 //900秒内有1次更新
save 300 10 //30秒内有10次更新
save 60 10000 //60秒内有10000次更新
2:手动执行bgsave/save,手动触发生成快照 直接执行save会阻塞主进程,bgsave的话会fork一个子进程完成快照
但是redis在发生RDB持久化的过程中有几个问题需要思考
- RDB快照过程中Redis是否会停止对外服务
2.如果不会停止服务,那如何处理新的请求
接下来我们看redis的RDB持久化的具体过程
1:主进程会fork一个子进程
2:子进程会共享一部分主进程的数据空间,并且把共享的数据置为read-only的状态,在这个过程中,子进程以rdb的协议来实行持久化
3:在持久化的过程中是避免不了有新的数据写入的,因为我们有一部分的数据是共享的,两个进程同时拥有一块数据,肯定会导致数据不一致的问题, 但是依赖于操作系统的fork机制,在修改的时候一定是修改部分内存页的数据,这个时候会触发对应内存页的copyonwrite的操作,不会影响子进程完 成持久化,持久化结束后,主进程会对子进程进行回收
RDB的文件格式
redis的rdb文件是一个非常紧凑的格式
- 开头的REDIS是固定的一个格式,redis在读取持久化文件的时候发现不是以REDIS开头的会报错
- 0006是RDB_VERSION当前RDB协议的版本
- AUX_FIELD_KEY_VALUE_PAIRS是一些辅助的字段
- data则为保存的数据,数据首先会选择redis_db,db选择之后就是键值对的数据,对应的键值对又会分为设置过过期时间和未设置过期时间的数据
RDB持久化的优点
1:二进制的数据非常紧凑,数据的恢复速度非常快
2:在持久化的过程中,性能最大化,fork子进程来完成写操作,让主进程继续处理命令,使用单独子进程来进行持久化,保证了redis的高性能
RDB持久化的缺点
1:数据安全性低,RDB是间隔一段时间进行持久化,如果持久化之间redis发生了故障,会发生数据丢失
2:linux fork之后,kernel把父进程中所有的内存页权限都设置readonly,然后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常中断(page-fault),陷入kernal的一个中断例程。中断例程中,kernel的copyonwrite机制就会把触发的异常页复制一份,于是父子进程各自持有独立的一份。如果这个时候有大量的写入操作,会产生大量的分页错误(页异常中断page-fault ),这样就得耗费不少性能在复制上。
AOF持久化执行流程
通过appendonly yes开启
Redis使用单线程响应命令,如果每次AOF文件命令都追加到磁盘,会极大的影响处理性能,所以Redis先写入aof缓冲区,根据用户配置的同步磁盘策略写入aof文件中,可以通过appendfsync参数配置同步策略:含义如下
appendfsync always #表示每次更新操作后手动调用fsync()将数据写入到磁盘
appendfsync everysec #表示每秒同步一次(折中方案,默认值)
appendfsync no #表述等操作系统进行数据缓存同步到磁盘(快速响应客户端,不对AOF做数据同步,同步文件由操作系统负责,通常同步周期最长30S)
AOF重写机制 随着命令的不断写入AOF,文件会越来越大,为了解决这个问题Redis引入了AOF重写机制压缩文件体积。AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程,AOF重写机制可以通过手动触发了自动触发
手动触发:bgreweuteaof命令
自动触发:
auto-aof-rewrite-percentage 100 #表示当前AOF文件空间和上一次重写后AOF文件空间的比值(100%)
auto-aof-rewrite-min-size 64mb #代表AOF重写时文件最小体积
AOF的优点:数据安全,AOF持久化可以配置appendfsync属性,有always,每进行一次命令操作就记录到aof文件中一次。
AOF的缺点:数据集比较大的时候,比RDB启动效率低
混合持久化
可以通过aof-use-rdb-preamble yes开启
加载时,首先会识别AOF文件是否以REDIS字符串开头,如果是,就按照RDB格式加载,加载完RDB后继续按AOF格式加载剩余部分。混合式持久化方案兼顾了RDB的速度,和AOF的安全性
完
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaSE - 排序算法
- JavaSE - 多态的本质
- Result Maps collection does not contain value for XXX 错误
- 当端口被占用如何kill占用端口的进程
- 将本地仓库同步到Github上的远程仓库
- 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱
- 关于void QProcess::start参数问题的解决
- Python格式化输出
- 多线程 - 生产者消费者模式
- TCP的三次握手和四次挥手
- Springboot异常处理
- Excel实战技巧84: 让形状生动起来
- 利用Python进行组合数计算
- Docker下解决mysql出现"the table is full"的问题
- unity3d 5.0中Renderer后面没有了material