Redis持久化(RDBAOF)

news2025/2/25 17:43:50

持久化简介:

不知道大家有没有遇见过,就是正工作的时候停电了,如果你用的是笔记本电脑还好,你有电池,但如果你用的是台式机呢,那恐怕就比较灾难了,假如你现在正在写一个比较重要的文档,如果你要使用的是word,这种办公自动化软件的话,他一旦遇到停电,其实你不用担心,因为它会给你生成一些其他的文件。

其实他们都在做一件事儿,帮你自动恢复,有了这个文件,你前面的东西就不再丢了。那什么是自动恢复呢?你要先了解他的整个过程。

我们说自动恢复,其实基于的一个前提就是他提前把你的数据给存起来了。你平常操作的所有信息都是在内存中的,而我们真正的信息是保存在硬盘中的,内存中的信息断电以后就消失了,硬盘中的信息断电以后还可以保留下来!

 

什么是持久化

 利用永久性存储介质(磁盘)将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化 。持久化用于防止数据的意外丢失,确保数据安全性。

持久化过程保存什么?

我们知道一点,计算机中的数据全部都是二进制,如果现在我要你给我保存一组数据的话,你有什么样的方式呢,其实最简单的就是现在长什么样,我就记下来就行了,那么这种是记录纯粹的数据,也叫做快照存储,也就是它保存的是某一时刻的数据状态。

还有一种形式,它不记录你的数据,它记录你所有的操作过程,比如说大家用idea的时候,有没有遇到过写错了ctrl+z撤销,然后ctrl+y还能恢复,这个地方它也是在记录,但是记录的是你所有的操作过程,那我想问一下,操作过程,我都给你留下来了,你说数据还会丢吗?肯定不会丢,因为你所有的操作过程我都保存了。这种保存操作过程的存储,用专业术语来说可以说是日志,这是两种不同的保存数据的形式啊。

总结一下:

第一种(RDB):将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据。

第二种(AOF):将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程。

RDB

1 .手动方式

直接通过指令 save 或 bgsave 来执行RDB持久化操作。

(1). save

我们可以直接在客户端命令行中执行 save 指令来,来进行RDB持久化操作。但是这种样可能存在问题,并且耗费性能。

需要注意一个问题,,如果有多个客户端各自要执行一个指令,把这些指令发送到redis服务器后,他们执行有一个先后顺序问题,假定就是按照1234的顺序放过去的话,那会是什么样的?记得redis是个单线程的工作模式,它会创建一个任务队列,所有的命令都会进到这个队列里边,在这儿排队执行,执行完一个消失一个,当所有的命令都执行完了,OK,结果达到了。

但是如果现在我们执行的时候save指令保存的数据量很大会是什么现象呢?

他会非常耗时,以至于影响到它在执行的时候,后面的指令都要等,所以说这种模式是不友好的,这是save指令对应的一个问题,当cpu执行的时候会阻塞redis服务器,直到他执行完毕,所以说我们不建议大家在线上环境用save指令。

save指令的执行会阻塞当前redis服务器,直到当前RDB过程完成为止,有可能会造成长时间的阻塞。线上环境不建议使用

(2). bgsave

上面我们讲到了当save指令的数据量过大时,单线程执行方式造成效率过低,那应该如何处理? 此时我们可以使用:bgsave指令,bg其实是background的意思,后台执行的意思是手动启动后台保存操作,但不是立即执行,当执行bgsave的时候,客户端发出bgsave指令给到redis服务器。注意,这个时候服务器马上回一个结果告诉客户端后台已经开始了,与此同时它会创建一个子进程,使用Linux的fork函数创建一个子进程,让这个子进程去执行save相关的操作,此时我们可以想一下,我们主进程一直在处理指令,而子进程在执行后台的保存,它会不会干扰到主进程的执行吗?

答案是不会,所以说他才是主流方案。子进程开始执行之后,它就会创建啊RDB文件把它存起来,操作完以后他会把这个结果返回,也就是说bgsave的过程分成两个过程,第一个是服务端拿到指令直接告诉客户端开始执行了;另外一个过程是一个子进程在完成后台的保存操作,操作完以后回一个消息

bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方式, 上面讲解的save可以放弃使用。

2 .自动方式

设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化

save second changes

参数:

second:监控时间范围

changes:监控key的变化量

范例:

save 900 1
save 300 10
save 60 10000

关于RDB的配置参数说明:

#设置本地数据库文件名,默认值为 dump.rdb
dbfilename filename

#设置存储.rdb文件的路径,通常设置成存储空间较大的目录中,目录名称data
dir path

#设置存储至本地数据库时是否压缩数据,默认yes,设置为no,节省 CPU 运行时间,但存储文件变大
rdbcompression yes|no

#设置读写文件过程是否进行RDB格式校验,默认yes,设置为no,节约读写10%时间消耗,单存在数据损坏的风险
rdbchecksum yes|no

RDB优缺点

RDB优点:

  • RDB是一个紧凑压缩的二进制文件,存储效率较高

  • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景

  • RDB恢复数据的速度要比AOF快很多

  • 应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。

RDB缺点

  • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据

  • bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能

AOF

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的。与RDB相比可以简单理解为由记录数据改为记录数据产生的变化

AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

启动AOF相关配置

#开启AOF持久化功能,默认no,即不开启状态
appendonly yes|no

#AOF持久化文件名,默认文件名为appendonly.aof,建议配置为appendonly-端口号.aof
appendfilename filename

#AOF写数据策略,默认为everysec
appendfsync always|everysec|no

AOF执行策略

AOF写数据三种策略(appendfsync)  

  • always(每次):每次写入操作均同步到AOF文件中数据零误差,性能较低,不建议使用。

  • everysec(每秒):每秒将缓冲区中的指令同步到AOF文件中,在系统突然宕机的情况下丢失1秒内的数据 数据准确性较高,性能较高,建议使用,也是默认配置

  • no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控

AOF重写

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。

AOF重写方式

(1). 手动重写

bgrewriteaof

(2). 自动重写

auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage

RDB与AOF区别

RDB与AOF对比(优缺点)

持久化方式RDB        AOF
占用存储空间小(数据级:压缩)大(指令级:重写)
存储速度
恢复速度
数据安全性会丢失数据依据策略决定
资源消耗高/重量级低/轻量级
启动优先级低       

RDB与AOF应用场景

  • RDB与AOF的选择实际上是在做一种权衡,每种都有利有弊

  • 如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF

  • 如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB

  • 灾难恢复选用RDB

  • 双保险策略,同时开启 RDB和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据的量

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

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

相关文章

Java集合——Map

Map集合 Map用于保存具有映射关系的数据,以键值对的形式存储,支持通过key来访问value,因此key不能重复。 Map接口下主要有Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap 四个主要的实现类,实现的基本原理类似&#xff0…

【图像处理】Hough变换检测直线与圆的原理

霍夫变换的基本原理 霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术,通过投票算法检测具有特定形状的物体。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间中的一个点形成峰值,从而…

菜菜学paddle第七篇:目标检测的基本概念

一、什么是目标检测? 在前面的几篇中,我们学习了使用卷积神经网络进行图像分类,比如手写数字识别是用来识别0~9这十个数字。与图像分类处理单个物体的识别不同,目标检测它识别的不仅是物体,还是多个物体,…

[附源码]Python计算机毕业设计高校教务管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Spring之IOC

IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语言中也有应用,并非 Spirng 特有。 IoC 容器是 Spring 用来实现 IoC 的载体&#xff0…

服务攻防-应用协议RsyncSSHRDPFTP漏洞批扫口令猜解

目录 测试思路 (一)口令猜解——SSH&RDP&FTP Demo: (二)配置不当-未授权访问-Rsync 文件备份 尝试读取src文件 (三)协议漏洞-应用软件-FTP&Proftpd 搭建 (四)协议漏…

音视频- iOS使用metal渲染图像(一)

概要 本文主要总结一下Metal的基本使用,用来渲染拍照的到的图像,其中涉及到的有UIKit中的MTKView,Metal中负责渲染的几个类,使用MSL(Metal Shading Language)编写着色器,最终将图片渲染出来…

Python 绘制极坐标图(玫瑰花图优化)

风速的玫瑰花图可见 Matlab 绘制风速、风向统计玫瑰花图 在今天的这边博文,选用Python工具,绘制玫瑰花图,并对图进行优化。 example 1 【不规则宽度】N = 20 theta = np.linspace(0.0,2*np.pi,N,endpoint=False)

Jmeter(十五):jmeter场景的运行方式(GUI运行和命令行运行)命令行相关参数

jmeter场景的运行方式(GUI运行和命令行运行) 运行方式: GUI运行:通过图形界面方式运行,该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源,建议大并发时不用,一般进行脚本调试; 命令行运…

【PTA-训练day17】L2-029 特立独行的幸福 + L1-071 前世档案

L2-029 特立独行的幸福 - 递归/模拟 判断素数 PTA | 程序设计类实验辅助教学平台 思路&#xff1a; 第一层循环是边界循环 for(int il;i<r;i)枚举每一个i 第二层循环是判断这个i是不是幸福数st数组 判定 i 这个数在迭代过程中是否出现循环 如果出现循环及时跳出比如&…

【TypeScript系列】【一篇就够】TypeScript知识点总结(二)

12 面向对象简介 简而言之&#xff0c;面向对象就是程序之中所有的操作都需要通过对象来完成。 举例来说&#xff0c; 操作浏览器要使用windows对象&#xff1b;操作网页要使用document对象&#xff1b;操作控制台要使用console对象。一切操作都要通过对象&#xff0c;也就是…

nacos--扩展--03--系统参数

nacos–扩展–03–系统参数 1、Nacos Server 配置参数位置&#xff1a;{nacos.home}/conf/application.properties里注意&#xff1a;如果参数名后标注了(-D)的&#xff0c;则表示是 JVM 的参数&#xff0c;需要在{nacos.home}/bin/startup.sh里进行相应的设置。 案例&#xf…

测试用例等级怎么划分?别再傻傻的一脸懵逼

我们都知道测试工程师最基本的能力便是编写测试用例&#xff0c;可是看似简单的用例&#xff0c;后面其实蕴含这个很多人忽略的细节&#xff0c;今天就来说测试里面所蕴含的很多细节。 很多时候不只是测试和测试用例息息相关&#xff0c;开发&#xff0c;产品也有的时候对于测试…

C/C++程序的断点调试 - CodeBlocks

本文以CodeBlocks为例&#xff0c;简述C/C程序断点调试的基本方法和过程。其它的IDE环境&#xff0c;大同小异。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许…

单链表翻转-链表篇

leetcode206单链表的翻转 题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出…

如何指定标签在页面中显示的位置

如何指定标签在页面中显示的位置 在HTML页面设计中常常需要调整标签&#xff08;元素&#xff09;的位置&#xff0c;那么&#xff0c;如何指定标签在页面中显示的位置呢&#xff1f; 使用标签的align属性指定标签在页面中显示的位置&#xff0c;如align"left|right|cen…

02加锁源码分析-ReentrantReadWriteLock原理-AQS-并发编程(Java)

文章目录3.1 加锁3.1.1 读锁加锁3.1.1.1 tryAcquireShared()3.1.1.2 readerShouldBlock()3.1.1.3 fullTryAcquireShared()3.1.1.4 doAcquireShared()3.1.2 写锁加锁3.1.2.1 tryAcquire()3.1.2.2 acquireQueued()3.2 加锁示意图3.2.1 先写锁在读锁3.2.2 先读锁在写锁后记3.1 加锁…

全网惟一面向软件测试人员的Python基础教程-Python数据类型中有那些故事呢?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

PHP+Laravel框架RabbitMQ简单使用

RabbitMQ安装教程请转到&#xff1a;RabbitMQ安装教程&#xff08;超详细&#xff09; 1、创建生产者 在app/Http/Controllers里创建一个php控制器文件&#xff0c; namespace App\Http\Controllers;use App\Http\Controllers\Controller; //引入amqp扩展 use PhpAmqpLib\Co…

铁路轨道交通智慧管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…