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持久化的过程中有几个问题需要思考

1.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的安全性

关注我的技术公众号,每周都有优质技术文章推送。

微信扫一扫下方二维码即可关注:

redis的两种持久化的机制,你真的了解么?的更多相关文章

  1. Redis系列之----Redis的两种持久化机制(RDB和AOF)

    Redis的两种持久化机制(RDB和AOF) 什么是持久化    Redis的数据是存储在内存中的,内存中的数据随着服务器的重启或者宕机便会不复存在,在生产环境,服务器宕机更是屡见不鲜,所以,我们希望 ...

  2. Redis的两种持久化机制

    Redis的两种持久化机制 1.持久化机制 client--->redis(内存)--->内存数据-数据持久化--->磁盘 两种方法 快照(Snapshot) AOF(Append ...

  3. Redis的两种持久化方式-快照持久化和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...

  4. Redis的两种持久化方式-快照持久化(RDB)和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为“持久化”效果. redis有两 ...

  5. 详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)

    redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...

  6. 详解Redis中两种持久化机制RDB和AOF

    redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...

  7. redis++:Redis的两种持久化 RDB 和 AOF

    Redis持久化备份数据的方式有两种:RDB(Redis DataBase) . AOF(Append Only  File). RDB 什么是RDB: 在指定时间间隔内,将内存中的数据集快照写入磁盘 ...

  8. Redis的两种持久化方式详细介绍

    一,Redis是一款基于内存的数据库,可以持久化,在企业中常用于缓存,相信大家都比较熟悉Redis了,下面主要分享下关于Redis持久化的两种模式 1.半持久化模式(RDB,filesnapshott ...

  9. [转载] redis 的两种持久化方式及原理

    转载自http://www.m690.com/archives/371 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串 ...

随机推荐

  1. 获取java栈异常

    package com.loan.modules.extbiz.in.rabbitmq.util; import java.io.PrintWriter; import java.io.StringW ...

  2. (28)Vim 4

    1.Vim多窗口编辑 在编辑文件时,有时需要参考另一个文件,如果在两个文件之间进行切换则比较麻烦.可以使用 Vim 同时打开两个文件,每个文件分别占用一个窗口. 例如,在査看 /etc/passwd ...

  3. 使用timeout-decorator为python函数任务设置超时时间

    需求背景 在python代码的实现中,假如我们有一个需要执行时间跨度非常大的for循环,如果在中间的某处我们需要定时停止这个函数,而不停止整个程序.那么初步的就可以想到两种方案:第一种方案是我们先预估 ...

  4. 前端html基础学习笔记二

    表单 1 : 表单标签 <form></form> 属性 : action = '接口地址' method = 'get / post' name = '表单名称' 2 : 表 ...

  5. 动态规划TG.lv(1) (洛谷提高历练地)

    动态规划TG.lv(1) P1005 矩阵取数游戏 分析:每行不超过80个数字,直接区间DP即可,\(dp[i][j]\)表示区间\([i,j]\)之间取数可以得到的答案,每次向右或者向左扩展即可.但 ...

  6. 最大子阵 DP or 前缀和orb暴力 能过

    在一个给定的n*m二维矩阵中求一个子矩阵元素和的最大值. 思路: 1:一个二维矩阵由两个点可以确定,枚举两个点,取子矩阵最大值. 2:在一维矩阵中,求一个序列的最大子段,利用 f[i]=max(f[i ...

  7. 【bzoj 2339】[HNOI2011]卡农(数论--排列组合+逆元+递推)

    题意:从编号为 1~N 的音阶中可选任意个数组成一个音乐片段,再集合组成音乐篇章.要求一个音乐篇章中的片段不可重复,都不为空,且出现的音符的次数都是偶数个.问组成 M 个片段的音乐篇章有多少种.答案取 ...

  8. 男孩周末班-k8s-架构图

    k8s-三层网络结构图 k8s-核心组件原理图 k8s-服务架构图 k8s-部署架构 小结 RBAC 用户账户: 角色: role(普通角色),只能运行在特定名称空间下 clusterrole,对集群 ...

  9. 1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】

    题目:戳这里 百度之星初赛原题:戳这里 题意:n个不同的数,求中位数为m的区间有多少个. 解题思路: 此题的中位数就是个数为奇数的数组中,小于m的数和大于m的数一样多,个数为偶数的数组中,小于m的数比 ...

  10. C/C++程序内存的各种变量存储区域和各个区域详解

    转自 https://blog.csdn.net/jirryzhang/article/details/79518408 C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名 ...