Redis的持久化方式

news2024/12/21 14:40:15

Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种,也可以将这两种方式结合使用。

•RDB:根据指定的规则“定时”将内存中的数据存储在硬盘上,生成的快照

•AOF:每次执行命令后将命令本身记录下来,每次执行命令都会将命令写入到aof文件中

RDB模式

RDB的持久化方式是通过快照(snapshotting)完成的,它是Redis默认的持久化方式,

Redis允许用户自定义快照条件,当符合快照条件时,Redis会自动执行快照操作。快照的条件可以由用户在配置文件中配置。配置格式如下

save

例如:

# save 3600 1

# save 300 100

# save 60 10000

第一个参数是时间窗口,第二个是键的个数,也就是说,在第一个时间参数配置的,时间范围内被更改的键的个数大于后面配置的changes时,即符合快照条件。当触发条件时,Redis会自动将内存中的数据生成一份副本rbd文件并存储在磁盘上,进行一个数据持久化,这个过程称为快照

除了上述规则之外符合我们条件redis自动生成快照,还有以下几种方式生成快照。

1.用户执行SAVE或者GBSAVE命令

2.执行FLUSHALL命令

3.执行复制(replication)时

save 5 1 表示5秒内,有一个key发生变化,就会生成rdb文件。

save和bgsave命令

除了让Redis自动进行快照以外,当我们对服务进行重启或者服务器迁移我们需要人工去干预备份。redis提供了两条命令来完成这个任务

1,save命令,当执行save命令时,Redis同步做快照操作,在快照执行过程中会阻塞所有来自客户端的请求。当redis内存中的数据较多时,通过该命令将导致Redis较长时间的不响应。所以不建议在生产环境上使用这个命令,而是推荐使用bgsave命令

2,bgsave命令

bgsave命令,bgsave命令可以在后台异步地进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。执行BGSAVE后,Redis会立即返回ok表示开始执行快照操作,

1:redis使用fork函数开启一个子进程,

2:父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时rdb文件

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

bgsave是异步执行快照的,在调用fork函数创建子进程时,只对这个时间之前的数据集进行备份(fork函数创建的子进程,是复制该时间点的父进程的,该时间点之后的数据是没有复制的),该时间点之后客户端对redis服务端发送的命令对数据的修改,是没有持久化的没有保存到快照中,

一、优势

1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集,这种文件非常适合用于进行备份和灾难恢复。

2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

3.RDB 在恢复大数据集时的速度比AOF的恢复速度要快。

二、劣势

•1、RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,频繁执行成本过高

•2、在一定间隔时间做一次备份,所以如果redis意外down掉的话,最后一次快照之后的修改数据会被丢失(数据有丢失)。

如果数据相对来说比较重要,希望将损失降到最小,则可以使用AOF方式进行持久化。

AOF持久化方式

AOF(Append Only File):Redis 默认不开启。AOF采用日志的形式来记录每个写操作,并追加到文件中。开启后,执行更改Redis数据的命令时,就会把命令写入到AOF文件中。

Redis 重启时会根据日志文件的内容把写指令从前到后执行一次以完成数据的恢复工作。

配置

# 开关 appendonly no /yes # 文件名 appendfilename “appendonly.aof”

AOF相关问题

问题1:数据都是实时持久化到磁盘吗?

虽然每次执行更改Redis数据库内容的操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了aof_buf缓存中。在默认情况下系统每30秒会执行一次同步操作。以便将aof_buf缓存中的内容真正地写入磁盘中。

在这30秒的过程中如果系统异常退出则会导致aof_buf缓存中的数据丢失。这个时候就需要Redis在写入AOF文件后主动要求系统将aof_buf缓存内容同步到磁盘中。在redis.conf中通过如下配置来设置同步机制。

fork()出一个子进程,通过子进程将aof_buf缓存中的数据同步到磁盘中

参数

说明

appendfsync everysec

AOF持久化策略(硬盘缓存到磁盘),默认

everysec

1 no 表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;

2 always 表示每次写入都执行fsync,以保证数据同步到磁盘,效率很低;

3 everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效率。

问题2:文件越来越大,怎么办?

AOF持久化是Redis不断将写命令记录到 AOF 文件中,随着Redis不断的运行,AOF 的文件会越来越大,文件越大,

为了解决这个问题,Redis新增了重写机制,

当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。

在启动时,Redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相对于RDB会慢一些

AOF重写机制触发时机:

问题3:重写过程中,AOF文件被更改了怎么办?

Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写:重写后的新 AOF 文件包含了重写这一时刻之前数据集所需的最小命令集合。

重写的流程是这样:

• 主进程会fork一个子进程出来进行AOF重写,并不是对原文件进行重新整理,而是直接读取redis服务内存中现有的键值对,然后用一条命令去代替每个键值对,写入到新的AOF文件中

• 在fork子进程这个过程中,服务端仍然可以对外提供服务,在子进程重写的这个时间段里面,,主进程的数据更新操作,会缓存到aof_rewrite_buf中,也就是单独开辟一块缓存来存储重写期间收到的命令,当子进程重写完以后再把缓存中的数据追加到新的aof文件。

• 当所有的数据全部追加到新的aof文件中后,会把旧的aof文件替换成新的aof文件,此后所有的操作都会被写入新的aof文件。

•如果在rewrite过程中出现故障,不会影响原来aof文件的正常工作,只有当rewrite完成后才会切换文件。因此这个rewrite过程是比较可靠的。

在aof_buf缓存到旧的aof文件中间其实还有一个子进程,将aof_buf缓存中的数据同步到aof文件中取

(3)重写子进程会将redis服务中的所有数据键值通过一条指令替代

Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。如果同时开启后,Redis重启会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少。

优点:

1、AOF 持久化的方法使用默认的每秒同步一次,Redis 最多也就丢失 1 秒的数据而已。

缺点:

1、对于具有相同数据的的Redis,AOF 文件通常会比 RDB 文件体积更大(RDB存的是数据快照)。

2、虽默认情况下,每秒同步一次的频率也具有较高的性能。在高并发的情况下,RDB 比 AOF 具有更好的性能保证。

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

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

相关文章

Android中使用GRPC简明教程

引言 Android作为一个开发平台,本身是使用java进行封装的,因此java可以调用的库,在Android中同样可以进行调用,这样就使得Android设备具有丰富的功能,可以进行各种类型的开发。 这篇文章就介绍如何在Android设备中使…

Spring Cloud Nacos源码讲解(七)- Nacos客户端服务订阅机制的核心流程

Nacos客户端服务订阅机制的核心流程 ​ 说起Nacos的服务订阅机制,大家会觉得比较难理解,那我们就来详细分析一下,那我们先从Nacos订阅的概述说起 Nacos订阅概述 ​ Nacos的订阅机制,如果用一句话来描述就是:Nacos客…

十四、项目实战二(CORS、同源策略、cookie跨域)

项目实战二 需求 以前后端分离的方式实现学生的增删改查操作 学生列表接口 url:/students/ 请求方法:get 参数: 格式:查询参数 参数名类型是否必传说明pageint否页码,默认为1sizeinit否每页数据条数默认为10namestr否根据姓…

SpringBoot+HttpClient+JsonPath提取A接口返回值作为参数调用B接口

前言 在做java接口自动化中,我们常常需要依赖多个接口,A接口依赖B,C,D接口的响应作为请求参数;或者URL中的参数是从其他接口中提取返回值作获取参数这是必不可少的。那么怎么实现呢?下面就来介绍多业务依赖…

大数据技术之Hive(三)函数

hive有大量内置函数,大致可分为:单行函数、聚合函数、炸裂函数、窗口函数。查看内置函数show functions;查看内置函数用法desc function upper;查看内置函数详细信息desc function extended upper;一、单行函数单行函数的特点是一进一出,输入…

Kubernetes之服务的基本管理

svc是kubernetes最核心的概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求进行负载分发到后端的各个容器应用上。pod生命周期短不稳定,pod异常后新生成的pod的IP会发生变化,通过…

JSD2212班第二次串讲-面向对象阶段

1. 概述 系统介绍一下接下来阶段要学习的内容: 1.JAVA: 1.1 java语言基础 1.2 java面向对象阶段(很重要!起的承上启下!!) 1.3 API阶段(Application Interface )学会看字…

Spring Cloud @RefreshScope 原理分析:代理类的创建

背景 前面我们知道,被 RefreshScope 注解的实例,在扫描生成 BeanDefiniton 时,被偷龙转凤了:注册了两个 Bean 定义,一个 beanName 同名、类型是 LockedScopedProxyFactoryBean.class 代理工厂 Bean,一个 s…

6-Java中新建一个文件、目录、路径

文章目录前言1-文件、目录、路径2-在当前路径下创建一个文件3-在当前路径下创建一个文件夹(目录)3.1 测试1-路径已经存在3.2 测试2-路径不存在3.2 创建不存在的路径并新建文件3.3 删除已存在的文件并新建4-总结前言 学习Java中如何新建文件、目录、路径…

ASE40N50SH-ASEMI高压MOS管ASE40N50SH

编辑-Z ASE40N50SH在TO-247封装里的静态漏极源导通电阻(RDS(ON))为100mΩ,是一款N沟道高压MOS管。ASE40N50SH的最大脉冲正向电流ISM为160A,零栅极电压漏极电流(IDSS)为1uA,其工作时耐温度范围为-55~150摄氏度。ASE40N…

【架构师】零基础到精通——架构发展

博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小留言…

PHP - ChatGpt API 接入 ,代码,亲测!(最简单!)

由于最近ChatGpt 大火,但是门槛来说是对于大家最头疼的环节, 我自己也先开发了一个个人小程序!大家可以访问使用下, 由此ChatGpt 有一个API 可以仅供大伙对接 让我来说下资质: 1:首先要搞得到一个 ChatGp…

HttpRunner接口自动化测试框架--常见问题

本篇文章主要总结在使用httprunner框架做接口自动化测试过程中遇到的问题 官方的问题总结:Issues httprunner/httprunner GitHub 1.在参数化过程中读取CSV文件,不能读取出整型来。 读取下方文件数据,全部是字符串格式 原因:c…

操作系统(复试准备)

操作系统(复试准备) 第一章知识点 操作系统概述 操作系统的概念 负责协调软硬件等计算机资源的工作 为上层用户,应用程序提供简单易用的接口 是一种系统软件 操作系统的功能与目标 资源的管理者 处理机管理,存储器管理&#x…

Linux 基础知识:指令与shell

目录一、操作系统二、指令三、shell一、操作系统 什么是操作系统? 单纯的操作系统应该是指操作系统内核。内核的作用就是管理计算机的软硬件资源,让计算机在合适的时候干合适的事情。 但是有一个问题,并不是人人都会直接通过内核来操作计算机…

异常信息记录入库

方案介绍 将异常信息放在日志里面,如果磁盘定期清理,会导致很久之前的日志丢失,因此考虑将日志中的异常信息存在表里,方便后期查看定位问题。 由于项目是基于SpringBoot构架的,所以采用AdviceControllerExceptionHand…

【跟着ChatGPT学深度学习】ChatGPT带我入门深度学习

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

树与二叉树与森林的相关性质

文章目录树的度树的性质二叉树的性质二叉树与森林树的度 树的度指的是树内所有节点的度数的最大值。 节点的度:节点所拥有的子树的数量。简单来说,我们直接数分支即可,例如下图: 在这颗二叉树中,节点2的度为2&#…

【Java】Synchronized锁原理和优化

一、synchronized介绍 synchronized中文意思是同步,也称之为”同步锁“。 synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。 synchronized是Java中解决并发问题的一种最常用的方法…

K3S系列文章-使用AutoK3s在腾讯云上安装高可用K3S集群

开篇 《K3s 系列文章》《Rancher 系列文章》 方案 在腾讯云上安装 K3S 后续会在这套 K3S 集群上安装 Rancher 方案目标 高可用3 台master 的 k3s 集群 数据备份k3s 数据备份到 腾讯云对象存储 cos 尽量复用公有云的能力Tencent Cloud Controller Manager (❌ 因为腾讯云已…