Redis的两种持久化机制

1、持久化机制

client--->redis(内存)--->内存数据-数据持久化--->磁盘

两种方法

  • 快照(Snapshot)
  • AOF(Append Only File)只追加日志文件

2、快照

2.1 特点

这种方式可以将某一时刻的所有数据写入到硬盘中,这也是redis的默认开启持久化方式,保存的文件是以.rdb结尾的文件,因此这种方式也被称为RDB方式。官方的说法叫快照持久化。

2.2 快照生成方式

  • 客户端方式:BGSAVE和SAVE指令

  • 服务器配置自动触发

    客户端方式1:BGSAVE
    客户端可以使用BGSAVE命令来创建一个快照,当接收到客户端的这个命令后,redis会调用fork操作来创建一个子进程,然后子进程负责把这个快照写入到磁盘中,而父进程继续处理命令请求 什么是fork:fork是linux系统的调用:在当前进程中,fork一个子进程,子进程最初与主进程是共享一份内存区域的。由于主进程不断进行数据的写操作,与子进程存在并发冲突问题。此时,redis采用写时复制技术(cow):
    当主进程写操作时,首先会复制一份将要涉及写操作的内存页。然后主进程在新复制的内存页上进行写操作,原有内存页继续供子进程持久化。

    客户端方式2:SAVE
    客户端还可以使用SAVE命令来创建一个快照,接收到SAVE命令的redis服务器会在快照创建完毕之前不再响应任何其他命令

    注意:SAVE命令并不常用,使用SAVE命令在快照创建完毕之前,redis处于阻塞状态,无法对外服务

    服务器配置自动触发:
    如果用户在redis.conf中设置了save配置选项,redis会在save选项条件满足之后自动触发一次BGSAVE命令,如果设置多个save配置选项,每当任意一个save配置选项条件满足,redis也会触发一次BGSAVE命令
    服务器接收客户端shutdown指令
    - 当redis通过shutdown指令接收到关闭服务器的请求时,会执行一个save命令,阻塞所有的客户端,不再执行客户端执行发送的任何命令,并且在save命令执行完毕之后关闭服务器

3.AOF方式——只追加日志文件

3.1 特点

这种方式可以将所有客户端执行的写命令记录到日志文件中,AOF持久化会将被执行的写命令写到AOF的文件末尾,来记录数据发生的变化,因此只要redis从头到尾执行一次AOF文件所包含的所有写命令,就可以恢复AOF文件的记录的数据集。

3.2 开启AOF持久化

1.修改 appendonly yes 开启持久化
2.修改 appendfilename "appendonly.aof" 指定生成文件名称

3.3 日志追加频率

1.always[谨慎使用]
说明:每个redis命令都要同步写入硬盘,严重降低redis速度,这种方式可以将发生系统崩溃时丢失的数据减少到最少,但是由于这种方式要对硬盘进行大量的写入操作,所以redis处理命令的速度会受到硬盘性能的限制。机械硬盘在这种频率下200左右个命令/s ;固态硬盘(SSD)大概几百万个命令/s;使用SSD用户请谨慎使用always选项,这种模式不断写入少量数据的做法有可能会引发严重的`写入放大`问题,导致将固态硬盘的寿命从原来的几年降低为几个月。 2.everysec[推荐默认]
说明:每秒执行一次同步,将多个写命令同步到磁盘。即使系统崩溃也最多丢失一秒的数据。 3.no[不推荐]
说明:完全由操作系统决定什么时候同步AOF文件,这个选项不会对redis性能带来影响,但是当系统崩溃时,会丢失不定量的数据,甚至是全部数据。另外如果用户硬盘处理写入操作不够快的话,当缓冲区被等待写入硬盘数据填满时,redis会处于阻塞状态,并导致redis的处理命令请求的速度变慢。

3.4 修改同步频率

修改appendfsync everysec|always|no 指定

3.5 AOF文件的重写

3.5.1 出现的问题

AOF方式会出现一个问题,持久化文件会越来越大,例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件Redis提供了AOF重写机制

3.5.2 AOF重写

用来在一定程度上减少AOF文件的体积,并且保证数据不丢失

3.5.3 触发AOF重写的方式

1.客户端方式
执行BGREWRITEAOF命令,不会阻塞redis服务 2.服务器配置方式自动触发
配置redis.conf中的auto-aof-rewrite-percentage选项 参加下图↓↓↓
- 如果设置auto-aof-rewrite-percentage值为100和auto-aof-rewrite-min-size 64mb,并且启用的AOF持久化时,那么当AOF文件体积大于64M,并且AOF文件的体积比上一次重写之后体积大了至少一倍(100%)时,会自动触发,如果重写过于频繁,用户可以考虑将auto-aof-rewrite-percentage设置为更大

3.5.4 重写原理

开启AOF持久化后生成一个appendonlydir文件夹,这个文件夹下有如下三个文件

从Redis 7.0.0 开始,Redis使用了多部分AOF 机制。也就是将原来的单个AOF文件拆分为基础文件(最多一个)和增量文件(可能不止一个)。基本文件表示重写AOF 时存在的数据的初始(RDB 或 AOF 格式)快照。所有这些文件都放在一个单独的目录中,并由清单文件跟踪。

重写过程:在触发AOF重写后,redis调用fork创建一个子进程,子进程根据此时的数据状态生成快照,同时主进程会创建一个新的增量文件用来继续处理客户端传来的命令请求,子进程将这个快照文件以命令的形式写入临时文件,当快照往临时文件写完后,通知主进程把新的增量文件和子进程生成的基础文件构建成临时清单,并将其持久化,redis对清单文件进行原子交换,使AOF重写的结果生效,生成一个新的基础文件,并且创建一个新的aof增量文件来接收命令。

4.持久化总结

两种持久化方案既可以同时使用,又可以单独使用,在某种情况下也可以都不使用,具体使用那种持久化方案取决于用户的数据和应用决定。

无论使用AOF还是快照机制持久化,将数据持久化到硬盘都是有必要的,除了持久化外,用户还应该对持久化的文件进行备份(最好备份在多个不同地方)。

Redis的两种持久化机制的更多相关文章

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

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

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

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

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

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

  4. 9. 图解分析Redis的RDB和AOF两种持久化机制的原理

    1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...

  5. 10.Redis的RDB和AOF两种持久化机制的优劣势对比

    1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...

  6. Redis学习一:Redis两种持久化机制

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 Redis是基于内存来实现的NO SQL数据库,但是我么你都 ...

  7. redis的RDB和AOF两种持久化机制

    思维导图:我的redis基础知识汇总 RDB持久化机制的优点 (1)RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的 ...

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

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

  9. 分析RedisRDB和AOF两种持久化机制的工作原理及优劣势

    一.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only(追加)的模式写入一个日志文件中,在redi ...

随机推荐

  1. uniapp小程序webSocket封装使用

    目录 1,前言 2,代码实现 3,使用 3.1,初始化 3.2,发送消息 3.3,接收消息 1,前言 最近在做IOT的项目,里面有个小程序要用到webSocket,借这个机会,封装了一个uniapp小 ...

  2. 【clickhouse专栏】clickhouse性能为何如此卓越

    在<clickhouse专栏>上一篇文章中<数据库.数据仓库之间的区别与联系>,我们介绍了什么是数据库,什么是数据仓库,二者的区别联系.clickhouse的定位是" ...

  3. Kubernetes将弃用Docker!与 containerd容器引擎

    时间戳:2022-06-07 20:32:19 星期二 撰写文档参考:(阿良-腾讯课堂)Kubernetes将弃用Docker 参考博客k8s入坑之路(3)containerd容器 container ...

  4. ABP框架之——数据访问基础架构(下)

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进. EF Core集成 EF Core是微软的ORM,可以使用它与主流的数据库提供商 ...

  5. kvm虚拟机在线扩容

    fdisk -l查看当前虚拟机磁盘容量 1. 镜像扩容 先操作镜像,给镜像增加2T容量: 关闭虚拟机back_log,然后再宿主机上给虚拟机扩容 qemu-img info /home/kvm/bac ...

  6. NC212914 牛牛与后缀表达式

    NC212914 牛牛与后缀表达式 题目 题目描述 给定牛牛一个后缀表达式 \(s\) ,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,'#'作为操作数的结束符号. 其中,表达式中只含有'+ ...

  7. NC202492 仓库选址

    NC202492 仓库选址 题目 题目描述 牛能在某小城有了固定的需求,为了节省送货的费用,他决定在小城里建一个仓库,但是他不知道选在哪里,可以使得花费最小. 给出一个 \(m \times n\) ...

  8. RapidEye快鸟、SPOT卫星遥感影像数据

    ​目前地理遥感生态网平台已发布高分辨率卫星遥感影像数据. 数据样例:百度云下载链接:https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码:i0m4   ...

  9. centos系统管理高级篇

    1 enable virtual box 控制 - 关机 可以通过虚拟机的关机按钮执行关机,而不是登陆centos再执行init 0 首先,安装acpid包 如果你的centos已经安装这个包,就省略 ...

  10. LM431精密+3.3V产生电路

    精密+3.3V电压通过三段可调并联稳压器LM431电路产生.LM431稳压电路如下图所示. 输出电压 UO仅与电阻 R35.R38 有关,计算公式如下: 式中常数2.5为内部基准电压,其保持恒定不变. ...