【Redis】持久化操作

news2024/9/24 21:27:34

一、RDB(Redis Database)

1、持久化
redis一般是将数据写到内存中,但也可以将数据写到磁盘中,这个过程称之为持久化

2、什么是RDB
指定的时间间隔内将内存中的数据集快照写入磁盘中

3、RDB是如何执行备份操作的
redis会单独创建(fork)一个子进程进行持久化,它先将数据写到一个临时文件中,等到持久化过程结束后,再用这个临时文件去替换上一次持久化好的文件(dump.rdb)

之所以进行这个临时文件覆盖持久化文件的操作,是为了保证数据的一致性、完整性和安全性
如果用直接写入dump.rdb的方式,在同步过程中出现断电等意外情况,就会导致此次持久化出现数据缺失的情况

4、相关配置
我们使用vi查看redis.conf,搜索SNAPSHOTTING查看相关配置

注意save和bgsave的区别:

  • save同步阻塞主进程,只有等save完后成,才能进行新操作
  • bgsave 是fork的子进程,非阻塞,等执行完后会通知主进程,然后关闭子进程
# save命令执行同步保存操作,将当前Redis实例的所有数据快照(snapshort)以RDB文件的方式保存到磁盘
# 可以配置的格式为save m n,m表示秒,n表示数据更改次数
# 也就是说每m秒内进行n次以上数据更改,就会触发持久化操作
save 3600 1

# 当redis无法继续写入磁盘,就关闭redis的写操作
stop-writes-on-bgsave-error yes

# 对存储到磁盘中的快照是否进行压缩存储,如果选择yes,redis会采用LZF算法进行压缩
rdbcompression yes

# The filename where to dump the DB
# RDB持久化生成的文件名
dbfilename dump.rdb

# The working directory.
# dump.rdb保存的地址,这里默认为启动目录下
dir ./

# 临时文件进行替换前,校验数据的完整性
rdbchecksum yes

5、优势

  • 性能最大化,生成RDB 文件的时候,redis 主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO 操作
  • RDB 在恢复大数据集时的速度比AOF 的恢复速度要快

6、劣势

  • 使用Fork进程创建临时文件进行数据备份,算上原来的持久化文件,数据需要占用2倍的空间
  • RDB 方式数据没办法做到实时持久化/秒级持久化,因为bgsave 每次运行都要执行fork 操作创建子进程,频繁执行成本过高
  • RDB是定时备份,如果在最后一次备份到下一次备份之间,redis发生故障,那么就会丢失那个时间点后的所有修改

7、RDB数据恢复
根据前面的redis配置文件可以得知
redis启动时,它会去读取启动路径下的RDB的持久化文件dump.rdb,恢复最后一次的快照数据
我们来验证一下

首先我们使用客户端A连接redis服务器,往redis中塞几条数据

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379>
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379>
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6379>

在这里插入图片描述

然后我们使用save或者bgsave命令,进行持久化,也可以修改redis.conf配置让他自动生效
持久化完成之后,我们将dump.rdb复制到某个指定路径下

127.0.0.1:6379> save
OK
127.0.0.1:6379>

在这里插入图片描述

接着清除所有的数据

127.0.0.1:6379> flushall
OK
127.0.0.1:6379>
127.0.0.1:6379> keys *
(empty array)

删除redis启动路径下的dump.rdb,停掉redis进程
然后我们将之前备份的dump.rdb传到redis启动路径下,重启redis服务
在这里插入图片描述

使用keys *可以看到,原来被删除的4个key都恢复了
这就是RDB的数据恢复操作
在这里插入图片描述

二、AOF(Append Only File)

1、什么是AOF
以日志的形式记录写操作(增删改操作),将Redis执行的所有写指令都记录下来到缓冲区(读操作不记录),然后追加到AOF文件中,当redis重新启动时,就会去重新执行一遍日志文件中的命令来恢复数据

2、相关配置
redis的AOF配置是默认关闭的,而且AOF的优先级是高于RDB的
当AOF和RDB同时开启时,启动redis会默认去执行aof文件中的命令

# AOF开启配置,如需打开,需要将此处改为yes
appendonly no

# AOF文件的默认名称
appendfilename "appendonly.aof"

# AOF同步频率,redis 默认配置是 everysec,即每秒刷新一次缓存区
appendfsync always  -----服务器在每次写操作后都将 aof_buf缓冲区中的所有内容写入到AOF文件,然后立即执行fsync()函数同步AOF文件到磁盘,所以always的效率是最慢的,但也是最安全的。可靠性高,性能低
appendfsync everysec  ---服务器在每次写操作后都要 将aof_buf缓冲区中的所有内容写入到AOF文件,并且每隔一秒就要在子线程中对AOF文件进行一次同步,创建一个异步任务执行fsync()函数。可靠性和性能都适中
appendfsync no      -----将缓冲区的内容写入AOF文件后,何时进行同步由操作系统控制,不执行fsync()函数。性能好,可靠性低,宕机可能会丢失较多数据

# no-appendfsync-on-rewrite选项处于打开状态时,在执行BGSAVE命令或者BGREWRITEAOF命令期间,服务器会暂时停止对AOF文件的同步,从而尽可能地减少I/O阻塞
no-appendfsync-on-rewrite no

# 配置了当 aof 文件相较于上一版本的 aof 文件大小的百分比达到多少时触发 AOF 重写,也就是大于上一版本1+100%的大小就重写
auto-aof-rewrite-percentage 100

# 配置了最小能容忍 aof 文件大小,超过这个大小必须进行 AOF 重写
auto-aof-rewrite-min-size 64mb

AOF有重写压缩操作,将几条写操作通过一条复杂的操作实现相同的结果(使用fork出来的子进程进行重写),比如set k1 v1和set k2 v2写为set k1 v1 k2 v2

3、AOF的数据恢复
AOF的恢复和上面RDB的恢复操作是一样,只需要在redis启动前,将需要恢复的数据所存储的AOF文件放在redis的启动路径下即可

4、AOF的异常恢复
如果遇到AOF文件损坏,我们在启动路径下使用redis-check-aof --fix appendonly.aof修复

5、AOF持久化流程

  • 客户端的写操作请求被追加到AOF缓冲区
  • AOF根据持久化策略【always、everysec、no】将操作sync同步到磁盘的AOF文件中
  • AOF文件大小超过重写策略或者手动重写时,会对AOF文件进行rewrite重写,压缩AOF文件容量
  • redis重启时,会去读取AOF的写操作进行数据恢复

6、优势和劣势

  • 优势

    • 丢失数据的概率更低
    • AOF文件比较好理解,可以进行操作分析,删除误操作后,重启redis完成数据的恢复
  • 劣势

    • AOF文件比RDB更占空间
    • 因为要执行记录的写操作,恢复起来更慢

如有错误,欢迎指正!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA 20个例程篇:18.SD卡存放音频WAV播放(下)

第七章 实战项目提升,完善简历 18.SD卡存放音频WAV播放(下) 进一步地我们再结合图1的示意图来分析wav_play模块的时序逻辑设计,大家可以清楚地看到WM8731在Right justified和主从时钟模式下,是先发左声道后发右声道数…

【LeetCode】专题一 二叉树层序遍历

二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点。 102. 二叉树的层序遍历 给你二叉树的根节点 root &…

【Labivew】简易计算器

🚩write in front🚩 🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

Secure CRT远程连接很快断线问题

问题描述 我们使用Secure CRT连接远程主机时可能会遇到几分钟没操作就无法操作了,需要断开重新连接,非常的麻烦,假如客户端或者服务端能够在快要超时的时候给对方发送一个心跳,得到对方响应就重置下超时时间,这样就能…

arm架构 --- 中断

ARM的异常 终止程序的正常执行过程而不得不去完成的一些特殊工作 中断是异常的一种,包括外部硬件产生的异常和芯片内部硬件产生的内部中断。 ARM有七种处理器模式,其中用户模式和系统模式之外的5钟处理器模式叫做异常模式,用户模式之外的6…

osgEarth示例分析——osgearth_terrainprofile

前言 osgearth_terrainprofile示例,涉及到一个新的类 TerrainProfileCalculator(地形轮廓计算器类),用来计算两个点连线之间的地形数据。左下角会根据点击的起点和终点进行计算,并更新显示地形信息。 效果 拖动地球,到某一个视…

[附源码]Python计算机毕业设计SSM基于的智慧校园安防综合管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

软件安全测试-Web安全测试详解-XSS攻击

目录 1. XSS攻击 1.1 XSS攻击原理 1.2 XSS能做什么 1.3 XSS三种类型 1.4 XSS三种途径 1.5 XSS测试方法 1.5.1 查看代码 1.5.2 准备测试脚本 1.5.3 自动化测试XSS漏洞 1.5.4 XSS注入常用语句 1.6 XSS漏洞防范h3 1.6.1 对输入和URL参数进行过滤(白名单和黑名单) 1.6.…

tensorflow入门(一) 计算图、张量、会话的概念

1、计算图 计算图是tensorflow中最基本的一个概念,tensorflow中的所有计算都被转化成计算图上的节点。tensorflow的名字已经说明了它最重要的两个概念------tensor和flow。张量这个概念在数学或者物理学中可以有不同的解释,在tensorflow中,张…

基于tensorflow的深层神经网络(三)如何用tensorflow优化神经网络

1、神经网络优化算法 梯度下降算法主要用户优化单个参数的取值,而反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据上的损失函数尽可能小。反向传播算法是训练神经网络的核心算法,它可以根据定义…

红黑树的插入过程

一棵红黑树是一种特殊的二叉查找树,具有以下性质: 每个节点要么是红色,要么是黑色。根节点是黑色。每个叶子节点(NIL)是黑色。如果一个节点是红色的,那么它的两个儿子都是黑色的。从任意一个节点到其每个叶…

71.qt quick-可伸展菜单-抽屉栏示例 通用QML界面(一键换肤)

在我们之前章节已经提供过了抽屉栏和菜单伸展栏: 63.qt quick-QML侧边滑动栏(不需要任何图片资源,支持自定义左右方向和大小)_诺谦的博客-CSDN博客_qml侧边栏68.qt quick-qml多级折叠下拉导航菜单 支持动态添加/卸载 支持qml/widget加载等_诺谦的博客-CSDN博客_qml下拉菜单 由…

三维家发生工商变更:注册资本减少46%,美凯龙、阿里等股东退出

近日,云工业软件服务商广东三维家信息科技有限公司(下称“三维家”)发生工商变更,注册资本由16.9254亿元变更为9亿元,同比减少46.83%。同时,包括红星美凯龙、阿里巴巴等多名股东退出,变更时间为…

01.Spring源码整体脉络介绍及源码编译——四

IOC是核心 IOC 容器加载过程【重要】:所有模块都依赖IOC,aop,循环依赖都依赖IOC IOC控制反转,控制理念,来解决层与层之间的耦合。DI注入实现 怎么讲Bean交给IOC容器来管理 配置类xml,注解 加载spring上下…

java计算机毕业设计ssm学院校友信息管理系统的设计与实现5yqhy(附源码、数据库)

java计算机毕业设计ssm学院校友信息管理系统的设计与实现5yqhy(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts…

【Java基础篇】基础知识易错集锦(二)

我们同样用几道例题来回顾相对应的基础知识; 解析: 首先我呢区分一下实例变量和局部变量; 局部变量:定义在方法内部的变量;实例变量:定义在类中但在任何方法之外,你也可以理解为全局变量&…

16.C预处理器和C库

文章目录C预处理器和C库16.1翻译程序的第一步16.2明示常量:#define16.3在#define中使用参数16.3.1用宏参数创建字符串:#运算符16.3.2预处理器黏合剂:##运算符16.3.3变参宏:...和__VA_ARGS__16.4宏和函数的选择16.5文件包含&#x…

NCTF2022 calc题目复现

calc(环境变量注入getshell) 经典计算器题目,看着有点眼熟,没错,就是buu三月赛的一道题目。由于那时候web可能都算不上入门,所以也就没有复现。比赛时就网上看了看三月赛的wp,但是没有什么用&a…

IEEE 二进制浮点数的表示

今天,我来将 IEEE 二进制浮点数的表示方式进行一个简单的介绍。 浮点数 在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long double。这几种浮点型所容纳的长度不同,当然它们存储的精度也就…

[附源码]JAVA毕业设计新型药物临床信息管理系统(系统+LW)

[附源码]JAVA毕业设计新型药物临床信息管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 …