【redis 第五篇章】持久化之AOF和RDB

news2024/9/28 14:45:04

一、概述

Redis 是内存数据库,如果不能将内存中的数据保存到磁盘中,那么一旦服务器进程退出,数据库中数据会消失,所以 Redis 提供了持久化的功能, Redis 分为两种持久化方式:RDBAOF,有以下几个特点:

  • 1、RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。
  • 2、AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF 命令以 Redis 协议追加保存每次写的操作到文件末尾。Redis 还能对 AOF 文件后台重写,使得 AOF 文件的体积不至于过大。
  • 3、如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化的方式。
  • 4、你也可以同时开启两种持久化方式,在这种情况下,当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据。因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整。

二、RDB

1、概念

在指定的时间间隔内将内存中的数据集快照写入磁盘中,它恢复的时候是将快照中的文件直接读取到内存中。

2、持久化机制之BGSAVE

在这里插入图片描述

通常,会立即返回 ok,Redis 进程会执行 fork 操作创建子进程,Redis在 fork 时,父进程会继续为客户端提供服务,子进程会将数据持久化到硬盘上,然后退出。如果已经在后台执行保存或者正在运行另一个非后台保存的进程,特别是正在进行 AOF 写入时,则会返回错误。如果使用了 bgsave 任务,而正在进行 AOF 写入时,该命令将立即返回 ok,并计划在下一次机会运行后台保存。阻塞只会在 fork 阶段。

客户端可以使用lastsave命令检查操作是否成功。

3、持久化机制之SAVE

在这里插入图片描述

不会接受客户端执行的操作命令,等持久化工作完成之后,会将新的文件替换旧的文件。

4、持久化机制之自动触发

redis.conf 中可以配置,让用户自定义 save 属性,让服务器每一段时间内执行一次 bgsave 操作。

  # 服务器在900秒内,对数据库进行了至少1次修改
  save 900 1
  
  # 服务器在300秒内,对数据库进行了至少10次修改
  save 300 10
  
  # 服务器在60秒内,对数据库进行了至少10000次修改
  save 60 10000
  
  # bgsave发生错误时是否停止写入,一般为yes
  stop-writes-on-bgsave-error yes
  
  # 持久化时是否使用LZF压缩字符串对象?
  rdbcompression yes
  
  # 是否对rdb文件进行校验和检验,通常为yes
  rdbchecksum yes
  
  # RDB持久化文件名
  dbfilename dump.rdb
  
  # 持久化文件存储目录
  dir ./

5、恢复数据机制

只需要将 rdb 文件放在我们 redis 启动目录就可以了,redis 启动的时候会自动检查文件并恢复其中的数据。

6、优点

  • RDB 是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集。
  • RDB 是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复。
  • RDB 在保存 RDB 文件时父进程唯一需要做的就是 fork 出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他 IO 操作,所以 RDB 持久化方式可以最大化 redis 的性能。
  • 与 AOF 相比,在恢复大的数据集的时候,RDB 方式会更快一些。

7、缺点

  • 如果你希望在 redis 意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么 RDB 不适合你。虽然你可以配置不同的 save 时间点(例如每隔5分钟并且对数据集有100个写的操作),是 Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据。

  • RDB 需要经常 fork 子进程来保存数据集到硬盘上,当数据集比较大的时候,fork 的过程是非常耗时的,可能会导致 Redis 在一些毫秒级内不能响应客户端的请求。如果数据集巨大并且 CPU 性能不是很好的情况下,这种情况会持续1秒,AOF 也需要 fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。

三、AOF

1、概念

以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之,Redis 重启的话就会根据日志文件的内容将写的指令从前到后执行一次以完成数据的恢复工作。

2、持久化原理

在这里插入图片描述

所有操作的命令会追加在文件中。

3、开启AOF持久化

# 开启aof持久化方式,默认no
appendonly no

# aof 持久化生成的文件名称
appendfilename "appendonly.aof"

# 三种持久化机制
# appendfsync always
appendfsync everysec
# appendfsync no

4、三种触发持久化机制

  • always
    同步持久化,每次发生数据变更会被立即持久化到硬盘中,性能比较差,但是数据完整性好。

  • everysec
    异步操作,每秒持久化数据到硬盘一次,可能会丢失一秒的数据。

  • no
    从不持久化到硬盘。

5、AOF文件损坏

如果 aof 文件被破坏,redis 服务是启动不了的。redis 本身提供了修复了工具。redis-check-aof --fix appendonly.aof

6、优点

  • 根据配置不同的策略,让你选择持久化的方式。
  • AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题。
  • Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
  • AOF 文件有序地保存了对数据库执行的所有写入操作,这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂,对文件进行分析(parse)也很轻松。导出(export)AOF文件也非常简单:举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写,那么只要停止服务器,移除 AOF 文件末尾的 FLUSHALL 命令,并重启 Redis,就可以将数据集恢复到 FLUSHALL 执行之前的状态。

7、缺点

  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。

四、如何选择持久化机制

开启两种持久化方式,根据自己的业务需求针对redis进行配置的调整。

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

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

相关文章

荟萃科技:国外问卷调查有没有实时更新的题库?

有的,口子查和渠道查都是。 口子查的题目都是国外的公司发放在网络上,都是实时发布,所以我们需要去国外的各大社交平台做题。 这些题目不是集中的,而是散布在网站里面,需要我们去找,都是老外上班实时发放…

数据结构(其二)--线性表(其三)

目录 11.特殊矩阵的压缩存储 (1).一维数组的储存结构 (2).二维数组的存储结构 (3).普通矩阵的存储 (4).特殊矩阵的压缩存储 i.对称矩阵 ii.三角矩阵 iii.三对角矩阵 iiii.稀疏矩…

社科经管类:7本期刊被标记为“On Hold”状态!

本周投稿推荐 SCI&EI • 4区“水刊”,纯正刊(来稿即录) • CCF-B类,IEEE一区-Top(3天初审) EI • 各领域沾边均可(2天录用) 知网(CNKI)、谷歌学术 …

Github 2024-08-05 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-08-05统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目4JavaScript项目3Python项目3Java项目2TypeScript项目2C项目1Shell项目1Dockerfile项目1非开发语言项目1免费编程学习平台:freeCodeCamp…

2.2 (2) 调度算法

文章目录 调度算法的评价指标CPU利用率系统吞吐量周转时间等待时间响应时间总结 典型的调度算法先来先服务(FCFS)短作业优先(SJF)高响应比优先(HRRN)时间片轮转调度算法优先级调度算法多级反馈列队调度算法…

动态规划:打家劫舍系列

目录 1. 打家劫舍1(线性数组)(LeetCode198) 解法1:动态规划(二维dp数组) 解法2:动态规划(一维dp数组) 解法3:动态规划(一维dp数组优化) 2. 打家劫舍2(环形数组)…

信号处理——自相关和互相关分析

1.概括 在信号处理中,自相关和互相关是相关分析非常重要的概念,它们能分析一个信号或两个信号在时间维度的相似性,在振动测试分析、雷达测距和声发射探伤得到了广泛的应用。自相关分析的研究对象为一个信号,互相关分析的研究对象…

spring原理(第八天)

aop的实现原理 AOP 底层实现方式之一是代理,由代理结合通知和目标,提供增强功能 除此以外,aspectj 提供了两种另外的 AOP 底层实现: 第一种是通过 ajc 编译器在编译 class 类文件时,就把通知的增强功能,织…

Linux之文件系统

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 C进阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.磁盘 二.对磁盘进行管理 三.通过inode找到文件…

Netty的几种IO模式的实现与切换

写在文章开头 今天我们就基于Netty来简单聊聊开发中几种常见的IO模式以及Netty对于这几种IO模式的实现,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项…

如何在RabbitMQ中防止消息丢失

如何在RabbitMQ中防止消息丢失 在分布式系统中,消息的可靠传递是至关重要的。RabbitMQ作为一个强大的消息队列系统,提供了多种机制来确保消息不会丢失。本文将介绍在RabbitMQ中防止消息丢失的几种方法。 消息确认机制 消息发布确认 在RabbitMQ中&…

pdf转换器哪个好?不要错过这4款转换工具

pdf转换器哪个好?选择一款高效的PDF转换器,无疑能极大地便利我们的日常工作与学习。它不仅能够轻松实现PDF文件与Word、Excel、图片等多种格式之间的互转,还支持批量处理,显著提高工作效率。无论是编辑修改、格式调整还是分享传阅…

深入浅出消息队列----【RocketMQ 和 Kafka 消息存储差异对比】

深入浅出消息队列----【RocketMQ 和 Kafka 消息存储差异对比】 RocketMQ 的消息存储Kafka 的消息存储对比 RocketMQ 与 Kafka 本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法 文章来源:编程导航-鱼皮【yes哥深入浅出消息队列专栏】 Roc…

指南!网上卖药品需要什么资质?

随着互联网技术的飞速发展,医药电商已经成为药品和医疗器械销售的重要渠道。处方药的网络销售政策逐步放宽,医药电商行业迎来了快速发展的春天。在这一领域,主要的参与者包括药品销售公司和电商平台。 为了吸引流量和满足处方药审方的需求&a…

第18课 Scratch入门篇:时钟-当前时间

时钟 故事背景: 在一个遥远的科技星球上,时间对于居民们来说无比珍贵。这个星球上的居民们都是技术高手,他们使用先进的编程技术来管理自己的生活。然而,星球上的时间系统最近出现了故障,导致时间的流逝变得不稳定。为…

【终极指南】大模型二次开发:从零基础到高手之路

随着人工智能技术的发展,预训练的大模型(例如GPT系列、BERT等)已成为自然语言处理领域的关键技术之一。对于开发者来说,掌握如何基于这些大模型进行二次开发,不仅可以提升自身的技术实力,还能为企业带来更多…

Flink 如何处理背压

文章目录 目录 前言 一、什么是背压? 二、处理背压的步骤 1.模拟背压机制 2.为什么要关心背压问题? 总结 前言 初次接触Flink的同学会对背压有很多的疑问。本文就是我学习的一些心得和体会,以及借鉴一些文章的感想。 Flink 如何处理背压效应…

使用snap的安装docker配置阿里云镜像加速

使用snap安装docker非常的简单,一条命令即可 snap install docker 但是通过这个命令安装的docker, 配置阿里云镜像跟常规安装的配置起来不太一样, 下面讲一下配置流程 修改docker配置文件/var/snap/docker/current/config/daemon.json 这个文件应该是已经创建好…

重磅!LangChain 官方发布 Agent IDE!!

1 LangChain 开发现状 LangChain 从应用开发框架出发,提供了一套代码级工具集,旨在降低 LLM 的开发难度,在过去一年中吸引了众多开发者,助力他们迅速打造 AI 大模型应用。然而,还有一群用户,他们希望门槛…

NC 最长无重复子数组

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 给定一个长度…