当前位置: 首页 > news >正文

Redis02-持久化策略

目录

RDB(Redis DataBase Backup file)

RDB执行原理

AOF(Append-Only File)

RDB和AOF对比



Redis支持多种持久化方式,以确保数据在内存中持久存储,以便在Redis服务器重启时数据不会丢失。Redis中持久化的两种主要实现方式:RDB和AOF。

RDB(Redis DataBase Backup file)

RDB是Redis的快照持久化方式,它会在指定的时间间隔内生成数据快照并将其保存到磁盘上的一个文件中。RDB文件包含了数据库的数据和键的过期时间信息。RDB持久化是一个点对点的持久化方式,它适用于数据快照的定期备份,以及在Redis服务重启时快速恢复数据。

RDB持久化可以通过配置文件设置,允许管理员指定快照的保存频率和文件名。RDB文件通常以二进制格式存储,可以通过SAVEBGSAVE命令手动触发持久化。

[root@10 ~]# redis-cli -h 127.0.0.1 -p 6379 -a 'password' #用密码方式连接
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> save  #由Redis主进程执行RDB,会阻塞所有命令
OK
127.0.0.1:6379> bgsave  #开启子进程执行RDB,避免主线程受影响
Background saving started
127.0.0.1:6379> 

Redis内部有触发RDB的机制,在redis.conf文件中:

# Save the DB to disk.
#
# save <seconds> <changes>
#
# Redis will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# Snapshotting can be completely disabled with a single empty string argument
# as in following example:
#
# save ""
#
# Unless specified otherwise, by default Redis will save the DB:
#   * After 3600 seconds (an hour) if at least 1 key changed
#   * After 300 seconds (5 minutes) if at least 100 keys changed
#   * After 60 seconds if at least 10000 keys changed
#
# You can set these explicitly by uncommenting the three following lines.
#
# save 3600 1
# save 300 100
# save 60 10000

说明一下:

# save "" 这是禁用RDB
save 3600 1 # 表示每小时有至少1个key发生变化,就执行bgsave
save 300 100 # 表示每5分钟有至少100个key发生变化,就执行bgsave
save 60 10000 # 表示每1分钟有至少10000个key发生变化,就执行bgsave
RDB执行原理
  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程)。

  2. 父进程接收处理客户端命令,子进程将内存中的数据写入硬盘中的临时文件。

  3. 当子进程写入完所有数据后,使用临时文件替换旧的RDB文件,至此一次快照操作完成。

需要注意的是:

  • 页表:记录虚拟地址与物理地址的映射关系(操作系统:用户空间程序只能访问虚拟内存,而不是直接操作物理内存)。

  • Fork采用的是一种copy-on-write的策略,目的是防止数组脏写:

    • 父进程读数据时共享读取

    • 父进程写数据是拷贝副本单独写操作

  • 在最近一次RDB和下一次RDB间隔期间出现Redis服务宕机,是会丢失这批数据的。

Redis启动后会读取RDB文件,文件是压缩过的二进制格式。占用空间小,利于传输和恢复。读取的时间根据服务器性能、数据结构、数据量大小会有不同差异。通常一个记录1000万个字符串类型键、大小为1GB的快照文件载入内存需要花费20-30秒。

RDB实现持久化,一旦出现异常退出,恢复的时候只能恢复到最近一次RDB的节点数据。如果数据比较重要,希望将损失降到最小,那么可以使用AOF进行持久化。

AOF(Append-Only File)

AOF是Redis的追加日志持久化方式,它将每个写操作(包括SET、INCR等)追加到一个日志文件中,以记录数据库操作的历史。AOF文件包含了一系列命令,它们可以用于重建数据库状态。

AOF持久化可以通过配置文件设置,可以选择以同步(fsync)或异步(no fsync)方式将操作追加到AOF文件中。同步方式可以保证数据的完整性,但通常会降低性能。异步方式则更快,但在发生故障时可能会导致数据丢失。

AOF默认是关闭的,在redis.conf文件进行设置:

# 是否开启AOF,默认是no
appendonly yes 
# AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率(也叫刷盘策略)是可以通过redis.conf配置的:

# appendfsync always 表示每执行一次写命令,立即记录到AOF文件 
appendfsync everysec # 推荐的,也是默认的每秒刷盘策略
# appendfsync no 表示写命令执行完先放到AOF缓冲区,由操作系统决定何时将缓冲区内容写入磁盘
配置项刷盘时机优点缺点
Always同步刷盘可靠性高,几乎不丢数据性能影响大
everysec每秒刷盘性能适中最多丢失1秒数据
no操作系统控制性能最好可靠性较差,可能丢失大量数据

由于AOF记录的是写命令,文件比RDB大的多。而且AOF会记录对同一个key的多次操作,但只有最后一次写操作才有意义。我们可以通过bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同的结果。

AOF也会在触发阈值时自动重写AOF文件。阈值可以在redis.cof配置:

# AOF文件比上次增长超过多少百分比触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积达到多少触发重写
auto-aof-rewrite-min-size 64mb
RDB和AOF对比
** **RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积很大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如AOF高,因为数据完整性更高
系统资源占用高,大量CPU和内存消耗低,主要是磁盘IO资源但AOF重写时会占用大量CPU和内存资源
使用场景可以容忍数分钟的数据丢失,追求更快的启动速度对数据安全性要求较高常见

两者各有优缺点,而实际的项目中往往是结合一起使用的,以提供更可靠的数据保护。在Redis重启时,会优先使用AOF日志文件来恢复数据,因为AOF记录了更详细的操作历史。如果AOF文件不存在或损坏,Redis可以使用RDB文件来进行数据恢复。

相关文章:

Redis02-持久化策略

目录 RDB&#xff08;Redis DataBase Backup file&#xff09; RDB执行原理 AOF&#xff08;Append-Only File&#xff09; RDB和AOF对比 Redis支持多种持久化方式&#xff0c;以确保数据在内存中持久存储&#xff0c;以便在Redis服务器重启时数据不会丢失。Redis中持久化的…...

Crypto(9)[MRCTF2020]keyboard

下载题目&#xff0c;看看里面是什么 这是什么鬼&#xff0c;由题目可以获得线索&#xff0c;keyboard,不是键盘吗&#xff0c;然后看了看别人写的wp&#xff0c;发现是九键&#xff0c;有几个数字对应的密文就是第几个字母 比如第一个6&#xff0c;对应的字母是mno&#xff0c…...

IOS自带的OCR识别功能

一、识别身份证 interface IDCardScanViewController () <AVCaptureMetadataOutputObjectsDelegate> property (nonatomic, strong) AVCaptureSession *captureSession; end implementation IDCardScanViewController - (void)viewDidLoad { [super viewDidLoad…...

1300*C. Product of Three Numbers(质数数学)

Problem - 1294C - Codeforces 解析&#xff1a; 首先这个数肯定不是质数&#xff0c;然后找到第一个因子p&#xff0c;对于n/p再判断质数&#xff0c;然后找到另外两个因子即可。 注意三个因子不能相同。 #include<bits/stdc.h> using namespace std; #define int long…...

【网络】五中IO模型介绍 + 多路转接中select和poll服务器的简单编写

高级IO 前言正式开始前面的IO函数简单过一遍什么叫做低效的IO钓鱼的例子同步IO和异步IO五种IO模型阻塞IO非阻塞IO信号驱动多路转接异步IO 小结 代码演示非阻塞IO多路转接select介绍简易select服务器timeout 为 nullptrtimeout 为 {0, 0}timeout 为 {5, 0}调用accept select编写…...

Camtasia2024破解版电脑屏幕录制剪辑软件

屏幕录制剪辑 TechSmith Camtasia for Mac v2021是 TechSmith 公司所开发出一款专业屏幕录像和编辑&#xff0c; Camtasia Studio2024版是由TechSmith公司官方进行汉化推出的最新版本,除2023版以下版本均没有官方汉化。 同时TechSmith公司打击第三方贩卖Camtasia Studio汉化的…...

c语言进阶部分详解(《高质量C-C++编程》经典例题讲解及柔性数组)

上篇文章我介绍了介绍动态内存管理 的相关内容&#xff1a;c语言进阶部分详解&#xff08;详细解析动态内存管理&#xff09;-CSDN博客 各种源码大家可以去我的github主页进行查找&#xff1a;唔姆/比特学习过程2 (gitee.com) 今天便接“上回书所言”&#xff0c;来介绍《高质…...

Unreal PythonScriptPlugin

Unreal PythonScriptPlugin 文章目录 Unreal PythonScriptPluginPython vs UnLua官方文档PyStubDoString 示例代码&#xff0c;引擎里有很多插件已经用 py 写编辑器脚本了 unreal.get_editor_subsystem(unreal.LevelEditorSubsystem).load_level("/Game/maps/UVlayoutTes…...

什么是数据可视化,为什么数据可视化很重要?

数据可视化是数据的图形表示&#xff0c;可以帮助人们更轻松地理解和解释复杂的信息。它涉及创建数据的视觉表示&#xff0c;例如图表、图形、地图和其他视觉元素&#xff0c;以传达数据中的见解、模式和趋势。数据可视化是将原始数据转化为可操作知识的关键工具。 以下是数据…...

chatgpt相关问题解答

1. openAI的chatgpt的收费方式有哪几种&#xff1f; 根据OpenAI官方的信息&#xff0c;ChatGPT的收费方式包括两种&#xff1a; 1.订阅计划&#xff08;Subscription Plan&#xff09;&#xff1a;OpenAI提供了ChatGPT Plus订阅计划&#xff0c;每月收费20美元。订阅计划的用…...

nssm将exe应用封装成windows服务

一、简介 NSSM&#xff08;Non-Sucking Service Manager&#xff09;是一个用于在Windows操作系统上管理和运行应用程序作为服务的工具。它提供了一种简单的方法来将任意可执行文件转换为Windows服务&#xff0c;并提供了一些额外的功能和配置选项。 优点&#xff1a; 简单易…...

golang实现极简todolist

ToDoList 最近跟着qimi老师做了一个ToDoList&#xff0c;我做的GitHub地址贴在这里&#xff0c;但由于前端出了点问题&#xff0c;所以都是用postman进行测试 原项目地址 部分功能展示 删除代办 查找代办 下面给出思路 思路 其实这是一个很简单的增删改查的实现&#xff…...

C# Onnx Dense Face 3D人脸重建,人脸Mesh

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.…...

Java 8 新特性 Stream 的使用场景(不定期更新)

方便在写代码的过程中直接使用&#xff0c;好记性不如好文章&#xff0c;直接 CV 改了直接用。提高 办&#xff08;摸&#xff09;公&#xff08;鱼&#xff09;效&#xff08;时&#xff09;率&#xff08;间&#xff09;&#xff0c; 不然就直接问 GPT 也不是说不行。 只符合…...

公开IP属地信息如何保护用户的隐私?

公开IP属地信息通常涉及与用户或组织的隐私有关&#xff0c;因此在公开此类信息时需要非常小心&#xff0c;以避免侵犯他人的隐私权。以下是触碰底线的几种情况以及如何保护网络安全和用户隐私&#xff1a; 个人隐私保护&#xff1a; 公开IP属地信息可能泄露用户的物理位置&…...

大桌子初步使用

大桌子安装成功后进入应用市场首推安装首页和网盘 一键安装的时候如果出现这样的错误&#xff0c;只要你能保证服务器是正常联网的就再试一次&#xff0c;十有八九就是网络不稳定 安装成功后&#xff0c;要到已安装里去启用一下 然后回到这个页面 http://服务器ip/dzzoffice/h…...

初步了解ORM框架之一Mybatis

ORM&#xff08;对象关系映射&#xff09;框架是现代软件开发中不可或缺的一部分。它们简化了将对象模型映射到关系数据库的过程&#xff0c;提供了更加便捷和高效的数据库操作方式&#xff0c;常见有&#xff1a;Hibernate、JPA&#xff08;Java Persistence API&#xff09;、…...

2023 electron最新最简版windows、mac打包、自动升级详解

这里我将讲解一下从0搭建一个electron最简版架子&#xff0c;以及如何实现打包自动化更新 之前我有写过两篇文章关于electron框架概述以及 常用api的使用&#xff0c;感兴趣的同学可以看看 Electron桌面应用开发 Electron桌面应用开发2 搭建electron 官方文档&#xff1a;ht…...

Ubuntu18.04安装pcl-1.12.1,make时报错:/usr/bin/ld: cannot find -lvtkIOMPIImage

解决方案&#xff1a; 在vtk安装包中&#xff0c;重新打开cmake-gui&#xff0c;然后勾选上VTK_Group_MPI和VTK_Group_Imaging。 cd VTK-8.2.0 cd build cmake-gui然后重新编译生成。 make -j8 # 或者j4,量力而行。 sudo make install 就可以解决了。 然后重新回到pcl安装…...

表单验证不通过的一个点form中未定义这个字段

这个坑就是犯了好几次了&#xff0c;一直记不住&#xff0c;尤其是加了字段后的时候&#xff0c;总是忘记&#xff0c;然后导致验证不通过。 以前我认为&#xff0c;只要表单绑定的内容中的属性有这个值就在ruler里面就可以验证他&#xff0c;&#xff0c;以至于我总是不在dat…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...