Redis02-持久化策略

news2024/12/26 10:52:48

目录

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文件来进行数据恢复。

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

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

相关文章

高效实用:批量重命名文件夹,提升工作效率

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件夹&#xff0c;而文件夹的命名则直接关系到我们的管理效率和查找效率。如何快速、准确地批量重命名文件夹&#xff0c;提升工作效率呢&#xff1f;本文将提供一些实用的方法和技巧。现在一起来看看云炫文件管理器是如…

【Java 进阶篇】Java Cookie共享:让数据穿越不同应用的时空隧道

在Web开发中&#xff0c;Cookie是一种常见的会话管理技术&#xff0c;用于存储和传递用户相关的信息。通常&#xff0c;每个Web应用都会在用户的浏览器中设置自己的Cookie&#xff0c;以便在用户与应用之间保持状态。然而&#xff0c;有时我们需要在不同的应用之间共享Cookie数…

2.2整式的加减(第1课时)——合并同类项教学及作业设计

【学习目标】 1&#xff0e;理解同类项的概念&#xff0c;并能正确辨别同类项&#xff0e; 2&#xff0e;理解合并同类项的依据是乘法分配律&#xff0c;掌握合并同类项的方法&#xff0e; 知识点归纳&#xff1a; ★合并同类项后&#xff0c;所得的项的系数是___________…

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

基础知识:位运算

基础知识&#xff1a;位运算 1. 两类表达式 1. 两类表达式

【网安AIGC专题11.1】论文12:理解和解释代码,GPT-3大型语言模型学生创建的代码解释比较+错误代码的解释(是否可以发现并改正)

Comparing Code Explanations Created by Students and Large Language Models 写在最前面总结思考 背景介绍编程教育—代码理解和解释技能培养编程教育—解决方案研究问题研究结果 相关工作Code ComprehensionPedagogical Benifis of code explanationLarge Language Models i…

【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成

文章目录 一、监控有哪些指标二、prometheus、grafana架构Prometheus 组件Grafana 组件架构优点 三、安装prometheus和node-exporter1. docker pull镜像2. 启动node-exporter3. 启动prometheus 四、promql基本语法五、grafana的安装和使用1. 新建空文件夹grafana-storage&#…

二维空间与三维空间的姿态表示法

二维空间与三维空间的姿态表示法 一、2D空间姿态表示法二、3D空间姿态表示法2.1 三个数表示空间姿态问题 2.2 九个数表示空间姿态问题 2.3 四个数表示空间姿态 结语Reference 假设&#xff0c;你有志成为我空军某航空旅歼-20飞行员&#xff0c;但要想开好飞机&#xff0c;那就得…

mac装不了python3.7.6

今天发现一个很奇怪的问题 但是我一换成 conda create -n DCA python3.8.12就是成功的 这个就很奇怪

数据结构——B树

文章目录 B树1. 概念2. B树插入分析3.插入过程4. B树插入实现5.B树验证6. B树性能分析7.B树&B*树8. 小结9. B树的运用MyISAMInnoDB 10. 总结 B树 可以用于查询的数据结构非常的多&#xff0c;比如说二插搜索树、平衡树、哈希表、位图、布隆过滤器&#xff0c;但如果需要存…

【MySQL】MySQL入门基础

文章目录 一、数据库基础1. 什么是数据库2. 数据库和文件3. 主流数据库&#xff08;关系型数据库&#xff09; 二、MySQL的基本使用1. 连接服务器2. 服务器管理3. 服务器、数据库、表关系4. 使用案例 三、数据的逻辑存储和实际存储四、MySQL的架构五、SQL分类六、存储引擎 一、…

Java基础-015-System.java常用类

Java基础-015-System.java常用类 1、标准输入输出2、获取属性3、System.java初始化4、设置标准输出System.out java/lang/System.java 1、标准输入输出 System.in、System.out public class Test {public static void main(String[] args) {String charsetName String.valueOf…

青少年python大赛知识点学习5--字典

python中的字典&#xff0c;与我们使用的新华字典有点像。索引与对象&#xff0c;新华字典存的是每个字的相关内容&#xff0c;python中的字典是一个容器类型的数据结构&#xff0c;通过key进行索引。 1.什么是字典 字典是python内置的重要数据之一&#xff0c;与列表一样是一…

Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录&#xff0c;包含对SYCL、DPC extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容 oneAPI编程模型综述 oneAPI编程模型提供了一个全面而统一的开发人员工具组合&#xff0…

Go与数据库:NoSQL数据库的应用

大家好&#xff01;我是[lincyang]。 今天我们将一起探索Go语言与NoSQL数据库结合的强大能力&#xff0c;并通过五个实际案例来深入理解它们的应用。 1. Go与MongoDB的结合 1.1 用户管理系统 在用户管理系统中&#xff0c;我们需要存储用户的基本信息和权限设置。MongoDB的…

MQTT协议零基础快速入门

MQTT协议零基础快速入门 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的发布/订阅消息传输协议&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;和机器对机器&#xff08;M2M&#xff09;通信场景。它具有简单、开放、易于实现等优…

产品经理入门学习(五):思维导图 原型设计

参考引用 黑马-产品经理入门基础课程 1. 思维导图的作用和应用场景 什么是思维导图&#xff1f; 思维导图是一种将思维进行可视化的实用工具。具体实现方法是用一个关键词去引发相关想法&#xff0c;再运用图文并茂的技巧把各级主题的关系用相互隶属的层级表现出来&#xff0c;…

多态 虚函数表深度剖析 纯干货讲解(2)

&#x1f4af; 博客内容&#xff1a;多态 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CSD…

crond服务

目录 一、crond服务基础知识 1、crond服务介绍 2、查看crond服务的状态 3、crond服务配置文件详解 4、额外的配置文件目录 二、crond服务基础命令 1、crond服务使用 2、 管理和操作 crond 服务 3、crond服务命令举例 一、crond服务基础知识 1、crond服务介绍 1、crond…

【redis面试题】双写一致性

文章目录 前言一、什么是双写一致性1. 先删除缓存还是先修改数据库1.1 先删除缓存的情况1.2 先修改数据库的情况 2. 双写一致性的解决方案 二、允许延迟一致的解决方法1. 采用 MQ 中间件2. 采用 canal 中间件 三、强一致性的解决方法1. 采用 Redisson 提供的读写锁 前言 跟着B…