Redis的持久化方法,各自优缺点,怎么选择?

devtools/2024/9/24 1:09:28/

持久化:

redis基于内存是数据库,内容存到内存中,也可以存到硬盘中,这个过程就叫持久化。有两种方案,RDB和AOP两种。

RDB

RDB持久化就是把当前进程数据生成快照保存到硬盘的过程RDB文件是⼀个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于R DB文件是保存在硬盘上的,所以即使Redis崩溃或者退出,只要RDB文件存在,就可以用它来恢复还原数据库的状态。

持久化触发方式

触发RDB持久化过程分为手动触发和自动触发。

手动触发:

分别对应save和bgsave命令:

  • save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间 阻塞,线上环境不建议使用。
  • bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。主进程不进行任何IO操作,确保了极高的性能,阻塞只发生在fork阶段,一般时间很短。
自动触发:

以下场景会自动触发RDB持久化:

  • 使用save相关配置,如“ save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。
  • 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点
  • 执行debug reload命令重新加载Redis时,也会自动触发save操作
  • 默认情况下行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。
Fork

Fork的作用是复制一个与当前进程一样的子进程,新进程所有的数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。它用写时复制技术,即现将数据写入到一个临时文件中,待持久化过程结束了,再用这个临时文件替换持久化好的文件。

 一般情况下父进程和子进程会公用一段物理内存,只有进程空间的各段内容要发生变化时,才将父进程的内容复制一份给子进程。

bgsave流程图:

RDB优缺点

优点

1 . 只有⼀个紧凑的⼆进制文件dump.rdb,非常适合备份、全量复制的场景。

2 . 容灾性好,可以把RDB文件拷贝到远程机器或者文件系统中,用于容灾恢复。

3 . 恢复速度快,RDB恢复数据的速度远远快于AOF的方式

缺点

1、实时性低,RDB是间隔⼀段时间进行持久化,没法做到实时持久化/秒级持久化。如果在这⼀间 隔事件发生故障,数据会丢失(会丢失最后一次快照的所有修改)。

2、存在兼容问题,Redis演进过程存在多个格式的RDB版本,存在老版本Redis无法兼容新版本R DB的问题。

3、Fork的时候,内存中的数据被克隆了一份,大致两倍的膨胀量需要考虑。数据量庞大时消耗性能。

AOF

AOF持久化:以独立日志的方式记录每次写命令(读操作不记录),redis重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

AOF同步频率设置

appendfsync always

始终同步,每次Redis的写入都会立刻记入日志,性能较差但是数据完整性较好。

appendfsync everysec

每秒同步,每秒记入一次日志,如果宕机,本秒的数据会丢失。

appendfsync no

redis不主动进行同步,把同步时机交给操作系统。

工作流程

AOF的工作流程操作:命令写入 (append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)

流程图:

流程如下:

1)所有的写入命令会追加到aof _ buf(缓冲区)中。

2)AOF缓冲区根据对应的策略向硬盘做同步操作。

3)随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。

4)当Redis服务器重启时,可以加载AOF文件进行数据恢复。

AOF优缺点

优点

1 . 实时性好,aof 持久化可以配置 appendfsync 属性,有 always ,每进行⼀次命令操作就记录 到 aof 文件中⼀次。

2 . 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis- check - aof 工具解决数据⼀致性问题。

缺点

1、AOF文件比RDB文件大,且恢复速度慢。

2 . 数据集大的时候,比RDB启动效率低。

RDB与AOF如何选择?

  • ⼀般来说, 如果想达到足以媲美数据库的数据安全性,应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入 AOF文件来恢复原始的数据,因为在通常情况下 AOF文件保存的数据集要比RDB文件保存的数据集要完整。
  • 如果可以接受数分钟以内的数据丢失,那么可以只使用RDB持久化。
  • 有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成 RDB 快照,非常便于进行数据备份, 并且 RDB恢复数据集的速度也要比AOF恢复的速度要快,除此之 外,使用RDB 还可以避免 AOF程序的bug。
  • 如果只需要数据在服务器运行的时候存在,也可以不使用任何持久化方式。


http://www.ppmy.cn/devtools/31825.html

相关文章

开源版本管理系统的搭建一:SVN服务端安装

作者:私语茶馆 1.Windows搭建SVN版本管理系统 点评:SVN本身非常简洁易用,VisualSVN文档支撑非常好,客户端TortoiseSVN非常专业。5星好评。 1.1.SVN概要和组成 背景介绍 Svn是一个开源版本管理系统,由CollabNet公司…

Django后台项目开发实战五

完成两个功能: HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用,实现候选人面试评估表的增删改功能,并且按照页面分组来展示不同的内容,如候选人基础信息,一面,二面的面试结…

JavaScript基础(四)

逻辑运算符 && 与 : 多个条件同时满足 ΙΙ 或 : 多个条件满足一个 &#xff01; 非 : 否定某个条件 例: <script> //&多个条件同时满足&#xff0c;才返回true //任意一个为false&#xff0c;就返回false var a 10; var b 20; …

负载均衡简介

负载均衡是分布式系统中一种重要技术&#xff0c;用于优化资源使用、提高服务可用性和响应速度&#xff0c;确保系统的扩展性和可靠性。主要的负载均衡种类包括以下几种&#xff1a; 1. **硬件负载均衡**&#xff1a; - **概念**&#xff1a;通过专门设计的硬件设备来分发网…

【JVM】JMM 内存模型

JMM 概述 内存模型 java[内存模型](Java Memory Model) 和 [内存结构]JMM规定了在多线程下对共享数据的读写时&#xff0c;对数据的原子性 有序性 可见性的规则和保障。 原子性 原子性问题: i和i–不是原子性操作! 所以一个i指令会在执行过程中被另一个线程执行! 问题分…

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议&#xff0c;建立在TCP协议之上 2.http请求 3.http响应 请求响应报文参考&#xff1a;https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…

Python内置函数locals()详解

Python中的locals()函数用于获取当前局部符号表的字典。这个字典包含了当前作用域中的局部变量。 函数定义 locals()函数不需要任何参数&#xff0c;并且返回当前局部变量作用域的内容。 locals()基本用法 在函数中使用 def my_function():a 10b 20local_variables loc…

环状串的字典序

【题目描述】 长度为n的环状串有n种表示法&#xff0c;分别为从某个位置开始顺时针得到。例如&#xff0c;图3-4的环状串有10种表示&#xff1a; CGAGTCAGCT&#xff0c;GAGTCAGCTC&#xff0c;AGTCAGCTCG等。在这些表示法中&#xff0c;字典序最小的称为"最小表示"…