REDIS-持久化方案

news2024/11/18 2:40:50

我们知道redis是内存数据库,它的数据是存储在内存中的,我们知道内存的一个特点是断电数据就丢失,所以redis提供了持久化功能,可以将内存中的数据状态存储到磁盘里面,避免数据丢失。

Redis持久化有三种方案,分别是RDB、AOF、混合持久化;

  1. RDB持久化(Redis DataBase)

RDB持久化是将某一时刻的内存快照(Snapshot)以二进制的方式写入磁盘。

触发方式:

  • 手动触发

手动触发方式可以直接用命令save或者bgsave,这两个命令的区别是是否会阻塞Redis主线程执行。

save命令:在客户端直接执行save命令即可触发Redis的持久化,但是这种方式会使得Redis处于阻塞状态,直到RDB持久化完成,才会响应其它客户端发来的命令,所以一定要小心使用。

可以看到dump.rdb文件的时间变了,表示rdb文件被修改过,表示save触发成功了。

bgsave命令:英文名称是background save,看英文单词就知道是后台保存的命令,这种方式会fork()一个子进程来执行持久化,当子进程被创建之后,Redis主进程就可以响应其他客户端的请求了。

  • 自动触发

自动触发的第一种方式就是在配置文件配置 save m n 意思就是在m秒内,如果有n个件发生变化,就会触发持久化;比如 save 20 1 意思就是在60秒内,至少有一个键发生变化就会触发持久化。

自动触发的第二种方式就是命令flushall,该命令是清空redis数据库的,要慎用,执行完这个命令之后就会自动触发持久化,但是这个持久化是把RDB的文件清空。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> 

还有一种触发方式是主从同步触发,在redis主从同步复制中,当从节点执行全量复制操作时,主节点会执行bgsave命令,并将RDB文件发送给从节点,该过程会自动触发持久化。

配置RDB持久化:

在配置文件中配置:

#持久化条件
save 3600 1 
save 300 100
save 60 10000
#该配置是说bgsave失败之后,是否停止持久化数据到磁盘
stop-writes-on-bgsave-error yes 
#是否启用RDB文件压缩
rdbcompression yes
# 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
rdbchecksum yes
# RDB 文件名
dbfilename dump.rdb
# RDB 文件目录
dir ./
RDB文件恢复

当Redis服务器启动的时候,如果redis的根目录存在RDB文件dump.rdb,redis就会自动加载RDB文件恢复持久化数据。

可以看到redis在启动的时候已经正常加载了RDB文件。

RDB持久化优缺点

优点:

1,RDB的内容是二进制数据,那么它占用的内存将更小更紧凑,也更适合作为备份文件。

2,RDB持久化可以后台持久化数据到磁盘(fork一个子进程)。

3,RDB文件恢复速度比AOF文件恢复得要快。

缺点:

缺点就是RDB可能会存在少量数据丢失,因为这种持久化方式是相当于每隔一段时间进行持久化,所以会丢失一段时间内得redis数据;还有就是进行持久化得时候会fork一个子进程进行持久化,如果数据量特别大可能会导致服务端有短暂得停顿。

  1. AOF持久化

AOF持久化,Append Only File,根据这个英文名称就可以看到是追加到文件;AOF持久化就是把Redis的每个键值对的操作都记录到文件中。

开启持久化

可以通过命令: config get appendonly 来查看是否开启了AOF持久化功能。

开启持久化:

Redis默认是关闭了AOF持久化的,想要开启可以使用命令行方式或者修改配置文件。

  • 命令行开启AOF持久化

使用命令 config set appendonly yes

127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
127.0.0.1:6379> config set appendonly yes
OK
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"

注意:命令行启动AOF持久化之后,Redis就已经开启持久化了,无需重启;但是Redis重启之后失效。

  • 配置文件启动AOF

在配置文件中添加:

appendonly yes

可以通过在客户端输入: config get dir 来获取配置文件所在位置。

这种配置方式需要重启redis之后才能生效。

触发持久化

有两种吃法方式:手动触发和自动触发

  • 自动触发

有两种情况可以自动触发AOF持久化,(1)满足AOF设置的策略触发;(2),满足AOF重写触发。

第一种触发策略有三种:

1.always:每条redis操作命令都会写入磁盘,最多丢失一条数据。

2.everysec:每秒钟写入一次磁盘,最多丢失一条数据。

3.no:不设置写入磁盘规则,根据当前操作系统来决定何时决定写入磁盘,linux默认30s一次。

设置方式:在配置文件中配置

appendfsync everysec
  • AOF重写

因为AOF是通过记录redis的执行命令来进行持久化的,所以时间久了之后AOF文件会越来越大,这样启动服务器在恢复数据的时候也会比较慢,为了解决这个问题Redis提供了AOF重写功能。

所谓AOF重写就是去读取Redis服务器的状态,然后压缩保存为AOF文件。意思就是假如说我们在Redis设置了一个值 k,然后对这个值进行100次自增操作,如果不做AOF操作,那么文件中就有一百条对这个值操作的命令,而AOF重写之后,会记录最终的操作结果,这样就去掉了不必要的信息。

触发AOF 重写要满足两个条件,这两个条件在Redis配置文件中配置:

auto-aof-write-min-size: 允许AOF重写的最小文件容量,默认是64mb
auto-aof-rewrite-percentage:AOF文佳重写的大小比例,默认是100%,也就是只有当前AOF文件比上一次大一倍的时候才启动AOF文件重写。 
数据恢复

一般情况下只要开启了持久化,并且正常提供了AOF文件,那么Redis在启动的时候就会自动加载AOF文件,进行数据恢复。

如果只开启了RDB持久化,那么Redis在启动的时候值会加载RDB文件。

如果两者同时开启了的花,Redis就只会加载AOF文件。

这种持久化的方式保存的数据更完整,根据选择只用不同的策略服务器最多可能会丢失1s内的数据,或者一条数据,默认是使用1s持久化一次的策略。AOF持久化有一个最大的缺点就是文件比较大,相比RDB持久化来说的话。在Redis负载较高的情况下RDB要比AOF性能好一些。

3.混合持久化

通过前面的介绍我们知道了RDB持久化和AOF持久化各有利弊,RDB持久化可能会导致一段时间的数据丢失,而AOF持久化形成的持久化文件比较大,启动加载会比较久。那么混合持久化结合这两种持久化的方式,来规避它们的缺点(混合持久化是在Redis 4.0版本之后才拥有的)。

开启混合持久化就是,基于AOF重写的时候,会把Redis当前的服务器数据以RDB格式写入到写入到AOF文件的开头,然年后续的梦里以AOF文件的格式追加到文件的末尾。这样每次重写就节省了更多的空间。

开启混合持久化

首先你可以在客户端输入命令:config get aof-use-rdb-preamble 来查看当前服务器是否开启了混合持久化。

通过命令行开启:

127.0.0.1:6379> config get aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "no"
127.0.0.1:6379> config set aof-use-rdb-preamble yes
OK

命令行开启方式存在的问题就是每次重启Redis服务器都得手动开启。

通过配置文件开启:

只需要更改配置文件中的:

aof-use-rdb-preamble no  #将no 改为yes即代表开启了

4.总结

对于Redis持久化我简单总结了三种持久化方式,虽然没讲啥原理上的东西(因为我自己也不懂:>),但是仔细看把大致流程要在脑海里有个印象,最好安装个Redis自己看一下这些配置,跟着配置一下是最好的,以后当面试官问到的时候,要尽可能的多讲一点东西。因为Redis的确是一个很优秀的中间件,被广泛的运用到我们的几乎每个项目中。

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

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

相关文章

【Node.js】 创建web服务器

Node.js什么是客户端,什么是服务器服务器和普通电脑的区别什么是http模块导入http模块服务器相关概念创建web服务器的基本步骤req请求对象req响应对象解决中文乱码根据不同的url响应不同的html内容什么是客户端,什么是服务器 客户端在网络节点中&#x…

CentOS7 配置共享文件夹

1、SSH连接CentOS,使用“rpm -qi samba"命令查询是否已经安装了Samba,如果没有安装,使用“yum install samba”命令,下载Samba包并安装,输入“y”,确认安装软件和软件依赖包。 2、使用“rpm -qa | gr…

kubernetes -- 核心组件介绍以及组件的运行流程

常用组件大白话说 如果想要官方的,详细的信息,请看官方文档。 https://kubernetes.io/zh-cn/docs/concepts/overview/components/ 现在介绍一些核心的概念: etcd:存储所有节点的信息,节点上部署的容器信息等都存在数…

SWIG妙用: MATLAB程序转python和Java库

1.引言Python或Java调用MATLAB程序需要安装MATLAB官方提供的支持库(MATLAB Runtime),而且适配的python或JDK版本有限,不方便移植。本文的思路是用MATLAB Coder将MATLAB源程序转为C/C代码,然后用swig将其打包成python 动…

Spring Cloud Alibaba Sentinel 动态规则扩展

前言 到目前为止&#xff0c;我们的规则定义是这样的&#xff1a; PostConstructpublic void initRole(){List<FlowRule> rules new ArrayList<>(1);FlowRule rule new FlowRule();// 设置规则匹配的资源名称rule.setResource("myFlowResource");// 规…

基于云原生分布式存储ceph实现k8s数据持久化

文章目录1、初始化集群1.1 集群机器配置1.2 配置主机名1.3 配置hosts文件1.4、配置互信1.5、关闭防火墙1.6、关闭selinux1.7、配置Ceph安装源1.8、配置时间同步1.9、安装基础软件包2、安装ceph集群2.1 安装ceph-deploy2.2 创建monitor节点2.3 安装ceph-monitor2.4 部署osd服务2…

Springboot毕业生生活用品出售网站系统-java ssm

(a) 管理员&#xff1b;管理员进入系统主要功能包括个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;用品分类管理&#xff0c;用品信息管理&#xff0c;系统管理&#xff0c;订单管理等功能并进行操作。 (b) 商家&#xff1b;商家进入系统主要功能包括个人中心&…

2004-2019年285个地级市实际GDP与名义GDP

2004-2019年285个地级市实际GDP和名义GDP 1、时间&#xff1a;2004-2019年 2、范围&#xff1a;285个地级市 3、说明&#xff1a;GDP平减指数采用地级市所在省份当年平减指数 4、代码&#xff1a; "gen rgdp gdp if year 2003 gen rgdp gdp if year 2003" re…

Java集合面试题:HashMap源码分析

文章目录一、HashMap源码二、HashMap数据结构模型图三、HashMap中如何确定元素位置四、关于equals与hashCode函数的重写五、阅读源码基本属性参考文章&#xff1a;史上最详细的 JDK 1.8 HashMap 源码解析参考文章&#xff1a;Hash详解参考文章&#xff1a;hashCode源码分析参考…

elasticsearch映射及字段类型

查询映射关系类型上对字段的类型进行映射&#xff0c;我们前面知道可以通过get方法请求_mapping查询指定类型的映射关系&#xff1a;此语句可以查询get-together索引下的group类型的映射关系更新映射关系使用put方法可以更新类型的映射这里指定了new-events类型的字段映射关系&…

【C语言】qsort——回调函数

目录 1.回调函数 2.qsort函数 //整形数组排序 //结构体排序 3.模拟实现qsort //整型数组排序 //结构体排序 1.回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来…

基础篇——如何在HTML元素中设置CSS样式

CSS Id 和 Class选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器。 id 选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式。 HTML元素以id属性来设置id选择器,CSS 中 id 选择器以 "#" 来定义…

四、Java框架之SpringMVC2_SSM整合

黑马课程 文章目录1. SSM整合案例1.1 创建web项目&#xff0c;并导入坐标1.2 完整的配置类SpringConfigJdbcConfigMyBatisConfigSpringMvcConfigSpringMvcSupportServletConfig1.3 创建数据库及表1.4 编写功能模块domain包dao包service包controller包1.5 接口测试2. 表现层与前…

XSS跨站脚本攻击剖析与防御:初识XSS

目录 跨站脚本介绍 1. 什么是XSS跨站脚本 2. XSS跨站脚本实例 3. XSS漏洞的危害 XSS的分类 1. 反射型XSS 2. 持久性XSS XSS构造 1. 利用< >标记注射Html /Javascript 2. 利用HTML标签属性值执行XSS 3. 空格回车Tab 4. 对标签属性值转码 5. 产生自己的事件…

PorterDuffXfermode与圆角图片

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 圆角图片 在项目开发中&#xff0c;我们常用到这样的功能&#xff1a;显示圆角图片。 这个是咋做的呢&#xff1f;我们来瞅瞅其中一种实现方式 /*** param bitmap 原图* p…

ChatGPT的注册与使用方法

ChatGPT无疑是最近最火的一个大模型AI应用,当艺术家还在跟AI争论AI绘画的问题时,NLP领域中的ChatGPT大模型应用,仿佛一下子替代了AI绘画应用,成为了最新争论的话题。最近也看到很多人在讨论ChatGPT,当然,很多人就算不是人工智能领域的也开始讨论ChatGPT,可见ChatGPT的风…

代替swagger的api接口神器

自动化API文档-APIFOX 文章作者&#xff1a;老杨 一&#xff1a;概述 大家在后端开发开发过程中&#xff0c;最痛恨的两天事情&#xff1a;1.写文档&#xff0c;2.别人不写文档。而我们后端开发&#xff0c;必定经历的事情就是要和前端&测试对接&#xff0c;我们需要把我…

vue104-123

影院组件 更改滚动条范围&#xff1a; 动态结算高度 //动态结算高度 this.height document.documentElement.clientHeight-选项卡高度this.height document.documentElement.clientHeight- document.querySelector(footer).offsetHeight px组件库elementUI 网址elementUI…

Docker Compose编排

一、概念1、Docker Compose是什么Docker Compose的前身是Fig&#xff0c;它是一个定义及运行多个Docker容器的工具通过 Compose&#xff0c;不需要使用shell脚本来启动容器&#xff0c;而使用 YAML 文件来配置应用程序需要的所有服务然后使用一个命令&#xff0c;根据 YAML 的文…

Spring Boot课程评价管理系统

文章目录主要功能截图&#xff1a;主要代码展示数据库设计设计总结项目地址&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java韩立】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 …