Redis中的RDB和AOF持久化机制(一)

news2025/1/24 22:43:25

Redis持久化

RDB快照(snapshot).

在默认情况下,Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中.Redis可以进行设置,让它在"N秒内数据集至少有M个改动"这一条件被满足时,自动保存一次数据集。比如说,以下设置会让Redis在满足"60秒内有至少1000个键被改动"这一条件时,自动保存一次数据集:

save 60 1000 // 关闭RDB只需要将所有的save保存策略注释掉即可

还可以手动执行命令生成RDB快照,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件,每次命令执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。

bgsave的写时复制(COW)机制

Redis借助操作系统提供的写时复制技术(Copy-On-Write, COW),在生成快照的同时,依然可以正常处理写命令。简单来说,bgsave子进程是由主线程fork生成的,可以共享主线程的所有内存数据。bgsave子进程运行后,开始读取主线程的数据,并把它们写入RDB文件。此时,如果主线程对这些数据也都是读操作,那么,主线程和bgsave子进程互不影响,但是,如果主线程要修改一块数据,那么,这块数据就会被复制一份,生成
该数据的副本。然后,bgsave子进程会把这个副本数据写入RDB文件,而在这个过程中,主线程仍然可以直接修改原来的数据。
配置自动生成RDB文件后台使用的是bgsave方式

在这里插入图片描述
redis.conf文件中有示例值

save 900 1
save 300 10
save 60 10000

AOF(append-only file)

快照功能并不是非常耐久(durable):如果Redis因为某些原因而造成故障停机,那么服务器将丢失最近写入、且仍未保存到快照中的那些数据,从1.1版本开始,Redis增加了一种完全耐久的持久化方式:AOF持久化,将修改的每一条指令记录进文件appendonly.aof中(先写入OS Cache,每隔一段时间fsync到磁盘)

举例

比如执行命令"set aaaaa 666",aof文件会记录如下数据,这是一种resp协议格式数据,星号后面的数字代表命令有多少个参数,$号后面的数字代表这个参数有几个字符。注意,如果执行带有过期时间的set命令,aof文件里记录的并不是执行的原始命令,而是记录key过期的时间戳

*3
$3
set
$5
aaaaa
$3
666

比如执行"set aaaaaa 888 ex 1000",对应aof文件里记录如下

*3
$3
set
$6
aaaaaa
$3
888
*3
$9
PEXPIREAT
$6
aaaaaa
$13
1604249786301

配置

可以通过修改配置文件来打开AOF功能:

appendonly yes

从现在开始,每当Redis执行一个改变数据集的命令时(比如SET),这个命令就会被追加到AOF文件
的末尾。这样的话,当Redis重新启动时,程序就可以通过重新执行AOF文件中的命令来达到重建
数据集的目的。还可以配置Redis多久才将数据fsync到磁盘一次.
推荐(并且也是默认)的措施为每秒fsync一次,这种fysnc策略可以兼顾速度和安全性

appendfsync always // 每次有新命令追加到AOF文件时就执行一次fsync,非常慢,也非常安全
appendfsync everysec // 每秒fsync到磁盘一次,足够快,并且在故障时只会丢失1s的数据
appendfsync no // 从不fsync,将数据交给操作系统来处理。更快,也更不安全的选择

AOF重写

AOF文件可能有太多没用指令,所以AOF会定期根据内存的最新数据生成AOF文件,例如,执行了如下几条命令:incre readcount

127.0.0.1:6379> incr readcount
(integer) 1
127.0.0.1:6379> incr readcount
(integer) 2
127.0.0.1:6379> incr readcount
(integer) 3
127.0.0.1:6379> incr readcount
(integer) 4
127.0.0.1:6379> incr readcount
(integer) 5

重写后AOF文件里变成

*3
$3
SET
$9
readcount
$1
5

如下两个配置可以控制AOF自动重写频率,当然AOF还可以手动重写,进入redis客户端执行命令bgrewriteaof重写AOF,注意,AOF重写redis会fork出一个子进程去做(与bgsave命令类似),不会对redis正常命令处理有太多影响

auto-aof-rewrite-percentage 100 // aof文件自上一次重写后文件大小增长了100%则再次触发重写
auto-aof-rewrite-min-size 64mb // aof文件至少要达到64M才会自动重写,文件太小回复速度本来就很快,重写的意义不大

RDB和AOF比较

在这里插入图片描述
生产环境可以都启用,redis启动时如果既有rdb文件又有aof文件则优先选择aof文件恢复数据,因为aof一般来说数据更全一点

Redis 4.0混合持久化

重启Redis时,我们很少使用RDB来恢复内存状态,因为会丢失大量数据。我们通常使用AOF日志重放,到那时重放AOF日志性能相对RD来说要慢很多,这样在Redis实例很大的情况下,启动需要花费很长的时间。Redis4.0为了解决这个问题,带来一个新的持久化选项——混合持久化。
通过配置可以开启混合持久化(必须先开启aof):

aof-use-rdb-preamble yes

如果开启了混合持久化,AOF在重写时,不再是单纯地将内存数据转换为RESP写入AOF文件,而是将重写这一刻之前地内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成两个AOF文件的替换。于是在Redis重启的时候,可以先加载RDB的内容,然后再重放增量AOF日志就可以完全替代之前的AOF全量文件重放,因此重启效率大幅得到提升。
在这里插入图片描述

Redis数据备份策略

  • 1.写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份
  • 2.每条都保留一份当日的数据备份到一个目录中去,可以保留最近一个月的备份
  • 3.每次copy备份的时候,都把太旧的备份给删了
  • 4.每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏

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

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

相关文章

软件测试需求分析如何编写?为什么要进行测试需求分析?

在软件开发的过程中,软件测试需求分析是至关重要的一个环节。测试需求分析是指对待测软件的需求进行全面细致的分析,明确软件测试的目标和范围,为测试活动的进行提供指导。通过对软件需求的详细分析,可以确保测试人员清楚了解软件…

配置与管理防火墙

配置与管理防火墙 1,概念:设置在不同网络或网络安全域之间的一系列部件的组合。 2,功能:保护内网中易手攻击的服务;控制内外网之间网络系统的访问;隐藏内网的IP地址及结构的细节,提高网络保护…

3月每日一题笔记

感谢我的好朋友的鼓励 3月4日 两种等价方式?都是错误的 ->加减中不能使用等价无穷小? ->不全面。 两项无穷小相减, 那么两项无穷小比值的极限不等于 1 时, 或者两项无穷小相加时, 其比值极限不等于 −1 时, 代数和差各项可以用等价无穷小替换 等…

基于springboot的海滨体育馆管理系统的设计与实现论文

摘 要 本基于Spring Boot的海滨体育馆管理系统设计目标是实现海滨体育馆的信息化管理,提高管理效率,使得海滨体育馆管理工作规范化、高效化。 本文重点阐述了海滨体育馆管理系统的开发过程,以实际运用为开发背景,基于Spring Boot…

LLM 系列——BERT——论文解读

一、概述 1、是什么 是单模态“小”语言模型,是一个“Bidirectional Encoder Representations fromTransformers”的缩写,是一个语言预训练模型,通过随机掩盖一些词,然后预测这些被遮盖的词来训练双向语言模型(编码器…

7.使用os.Args或flag解析命令行参数

文章目录 一、os.Args二、flag包基本使用 Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。 一、os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。 package mainimp…

彻底解析:企业为何必须采用CRM系统以及其五大作用

相关数据显示,CRM系统在欧美发达国家的普及程度高,超出80%的企业部署了CRM管理系统。然而在国内这个比例依然很小只有10几%,为什么企业需要CRM系统?因为CRM可以为公司实现线索管理、绩效管理、销售流程管理、市场营销管理以及数据…

【python开发】网络编程(下)

这里写目录标题 一、OSI7二、TCP和UDP协议(一)UDP和TCP示例代码1、UDP2、TCP (二)TCP三次握手和四次挥手 三、粘包1、实际案例12、实际案例23、实际案例3 四、阻塞和非阻塞五、IO多路复用 一、OSI7 在电脑和电脑之间进行数据传输…

Three.js--》探寻Cannon.js构建震撼的3D物理交互体验(二)

我们用three.js可以绘制出各种酷炫的画面,但是当我们想要一个更加真实的物理效果的话,这个时候我们就需要一个物理的库,接下来我们就讲解一下今天要学习的canon,它可以给我们提供一个更加真实的物理效果,像物体的张力、…

【center-loss 中心损失函数】 原理及程序解释(完)

文章目录 前言问题引出open-set问题抛出 解决方法softmax函数、softmax-loss函数解决代码(center_loss.py)原理程序解释 代码运用 如何梯度更新首先了解一下基本的梯度下降算法然后代码解释见下面train() 补充:外围知识(models.py…

同步通信和异步通信(RabbitMq学习前篇)

MQ学习前篇 文章目录 MQ学习前篇1、同步和异步通讯1.1、同步通讯和异步通讯1.2、同步调用存在的问题1.3、异步调用方案1.4、异步通信的缺点 1、同步和异步通讯 学习mq之前,就要先知道同步通讯和异步通讯的区别。 1.1、同步通讯和异步通讯 同步通讯就像是打电话&am…

部署LVS集群之DR模式

直接路由模式----DR模式 理念: 直接路由(是lvs的默认模式) DR模式和隧道模式唯一的区别:dr模式这四台服务器在同一网段,隧道模式 :这四台服务器不在同一网段 客户端 ------->代理服务器------->真实…

Unity中关于继承ScriptableObject的类

在游戏中我们会经常看到一些.asset的配置文件,而这些文件就是用一个自定义的类去继承ScriptableObject来生成的。比如当前有一些零散特效需要预加载,这个时候我们可以声明一个类去保存这些零散特效对象的信息,然后统一读取加载。 代码&#…

Pycharm与Anaconda安装

网址: Pycharm:https://www.jetbrains.com/pycharm/ Anaconda:https://www.anaconda.com/download/ 官网下载速度太慢可以选择到清华源下载:https://repo.anaconda.com/archive/ 一:Anaconda安装 安装: …

万丈高树平地起:通过中序与后序遍历数组构建二叉树

题目 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xf…

机器学习---数据分割

之前的文章中写过,我们可以通过实验测试来对学习器的泛化误差进行评估并进而做出选择。 为此,需使用一个“测试集"(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测 试误差”(testing error)作为泛化误差的近似。通…

即插即用篇 | YOLOv8 引入 NAM 注意力机制 | 《NAM: Normalization-based Attention Module》

论文名称:《NAM: Normalization-based Attention Module》 论文地址:https://arxiv.org/pdf/2111.12419.pdf 代码地址:https://github.com/Christian-lyc/NAM 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large…

b站小土堆pytorch学习记录——P8-P9 Tensorboard的使用

文章目录 一、前置知识1.Tensorboard是什么2.SummaryWriter3.add_scalar()4.add_image() 二、代码1.一次函数2.蚂蚁和蜜蜂图片 一、前置知识 1.Tensorboard是什么 TensorBoard 是 TensorFlow 的可视化工具,它允许开发者可视化模型的图(graph&#xff0…

Nano 33 BLE Sense Rev2学习第二节——手机蓝牙接收数据

Nano 33 BLE Sense Rev2需要下载的程序 #include <ArduinoBLE.h> #include "Arduino_BMI270_BMM150.h"float x, y, z; int degreesX 0; int degreesY 0;BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214"); // create service// cre…

论文阅读:Dataset Quantization

摘要 最先进的深度神经网络使用大量&#xff08;百万甚至数十亿&#xff09;数据进行训练。昂贵的计算和内存成本使得在有限的硬件资源上训练它们变得困难&#xff0c;特别是对于最近流行的大型语言模型 (LLM) 和计算机视觉模型 (CV)。因此最近流行的数据集蒸馏方法得到发展&a…