Redis 持久化之 RDB AOF

1、简介

        Redis 是一个基于内存的 key-value 类型的 Nosql 数据库,经常用来做缓存操作,但是一旦Redis 宕机,重启之后数据会丢失,因此,需要将内存数据进行持久化,保证服务重启后数据能够恢复之前的状态。Redis 持久化有两种方式:RDB 和 AOF。

2、RDB 持久化

        rdb 持久化是内存中的数据集快照写入磁盘,在恢复时再将硬盘中的文件直接读回内存,备份时是全量备份,保存在dump.rdb文件中。

2.1、配置 RDB 持久化
# 1、Redis 7重新指定自动触发 rdb 备份文件的标准
save 3600 1 300 100 60 10000  # 也可以自定义
# 2、指定生成rdb文件的名称
dbfilename dump.rdb
# 3、指定rdb文件的保存路径
dir ./testdata
# 4、备份出错停止接受新的请求
stop-writes-on-bgsave-error yes   # 默认开启
# 5、开启压缩rdb功能
rdbcompression yes  # 会消耗cpu资源,看情况开启,默认开启
# 6、数据校验
rdbchecksum yes  # 默认开启
2.2、触发 RDB 文件备份的情况

1)、配置文件中满足默认备份配置条件;

2)、在客户端手动执行 save/bgsave,save会阻塞当前Redis服务,不推荐使用,bgsave会fork出子线程执行 RDB 持久化,不会阻塞,推荐使用;

3)、执行flushall/flushdb也会触发 RDB 持久化,只不过生成的是空文件,将备份后的 RDB 文件移动到另外一个位置在执行 flush 操作,否则备份无意义;

4)、执行shutdown且没有开启 AOF 持久化也会触发 RDB 持久化;

5)、主从复制时,主节点自动触发。

2.3、通过 RDB 文件恢复数据

        将备份生成的 RDB 文件放到 Redis 的设置的数据保存目录下,启动 Redis 服务就可以恢复数据。(要和设置的 dir 参数和 dbfilename 参数保持一致 )。

2.4、查看最后一次备份时间

        通过以下命令查询:

# 1、从Redis中获取最后一次备份的时间戳
lastsave
# 2、在linux系统上将时间戳转化成时间
date -d @时间戳
3、AOF持久化

        AOF持久化是以日志的形式来记录每个写操作(读操作不记录),只追加不改写文件,Redis重启读取该文件将其中的命令一行一行执行,默认情况下Redis 是没有开启 AOF 的功能。

3.1、AOF 持久化配置
# 1、开启 aof 备份
appendonly yes  # 默认为 no
# 2、指定aof文件名
appendfilename "appendonly.aof"
# 3、指定aof保存路径,此路径是拼接 dir 的路径(与redis6有差别)
appenddirname "appendonlydir"
# 4、将aof文件刷新到磁盘的频率
# appendfsync always   # 有写操作就刷新
appendfsync everysec   # 每秒刷新一次
# appendfsync no       # 不刷新,由操作系统决定
# 5、redis7 将aof文件分成3个部分
appendonly.aof.1.base.rdb   # 基本文件
appendonly.aof.1.incr.aof   # 增加写操作记录文件
appendonly.aof.manifest     # 清单文件
# 6、aof文件重写
auto-aof-rewrite-percentage 100 # 根据上次重写后的aof大小,判断当前aof大小是不是增长了1倍
auto-aof-rewrite-min-size 64mb  # 重写时满足的文件大小为64mb
3.2、触发 AOF 重写的情况

1)、满足配置文件中重写要求;

2)、手动在客户端执行 bgrewriteaof 命令。

4、RDB 和 AOF 文件错误修复

        使用 redis-check-aof/rdb --fix  *.aof/*.rdb 命令进行修复。

5、混合持久化

        由于使用RDB 持久化的方式效率高,但是会丢失数据,aof 相对来说效率低一些,至于使用哪种持久化的方式,官网推荐使用混合持久化的方式。RDB镜像做全量持久化,AOF做增量持久化。

5.1、如果两种持久化方式都开启,未开启混合持久化数据文件加载顺序

        会优先加载 AOF 文件。

5.2、开启混合持久化的配置
# 1、开启混合持久化必须开启 AOF 持久化
appendonly yes
# 2、开启混合持久化
aof-use-rdb-preamble yes
 5.3、混合持久化文件格式

        混合持久化先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式。AOF包括了RDB头部+AOF混写。格式如下图所示。

6、Redis 禁用持久化
# 1、禁用rdb配置
save ""
# 2、禁用 aof 配置
appendonly no

注:在禁用持久化的配置下,我们还可以通过 save/bgsave 来生成rdb文件,还可以通过 bgrewriteaof 生成 aof 文件。

7、总结

        本文详细介绍Redis7持久化机制,帮助大家更加了解Redis是如何进行数据存储到磁盘的,加深对Redis的掌握和理解。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享) 

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

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

相关文章

软件资源管理下载系统全新带勋章功能 + Uniapp前端

测试环境:php7.1。ng1.2,MySQL 5.6 常见问题: 配置好登录后转圈圈,检查环境及伪静态以及后台创建好应用 上传图片不了,检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图,在前端uitl文件…

蓝桥杯练习题dfs与bfs

📑前言 本文主要是【算法】——dfs与bfs的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&#xff…

(循环依赖问题)学习spring的第九天

Bean实例的属性填充 Spring在属性注入时 , 分为如下几种情况 : 注入单向对象引用 : 如usersevice里注入userdao , userdao里没有注入其他属性 注入双向对象引用 : 如usersevice里注入userdao , userdao也注入usersevice属性 二 . 着重看循环依赖问题 (搞清原理即可) 问题提出…

Hive建表时候用的参数及其含义

1.序列化与反序列化 序列化器(Serializer)和反序列化器(Deserializer) SerDe 是两个单词的拼写 serialized(序列化) 和 deserialized(反序列化)。 什么是序列化和反序列化呢? 当进程在进行远程通信时,彼…

Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin

Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin 初始化状态,ImageView里面只是显示一张fitcenter被缩放的原图,当手指在图片上双击后(记录双击点位置:mCurX,mCurY)画一个红色小圆…

【Linux的权限命令详解】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 shell命令以及运行原理 Linux权限的概念 Linux权限管理 一、什么是权限? 二、权限的本质 三、Linux中的用户 四、linux中文件的权限 4.1、文件访问…

基于SpringBoot Vue高校失物招领系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

Django(八)

1. 管理员操作 1.1 添加 from django.shortcuts import render, redirectfrom app01 import models from app01.utils.pagination import Paginationfrom django import forms from django.core.exceptions import ValidationError from app01.utils.bootstrap import BootStr…

(学习日记)2024.01.19

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

2635. 转换数组中的每个元素

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 编写一个函数,这个函数接收一个整数数组 arr 和一个映射函数 fn ,通…

基于ssm+vue的宠物医院系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

GitHub提交 / 拉取时 443 fatal: unable to access ‘https:

这个问题嘛 懂得都懂 但是用了魔法后依旧会出现443错误 排查了工具发现并不是工具的问题 修改一下git代理即可解决 解决方法如下 确保魔法可用的情况下 打开魔法 打开系统设置 > 网络和Internet > 代理 找到自己的代理IP 如下 这里以我的代理IP和端口举例 在…

js变量提升

js变量提升 在JavaScript中,变量提升(Hoisting)是一种特殊的语法行为,它允许变量和函数声明在它们实际出现之前被JavaScript引擎识别。这意味着,当你在代码的后面部分使用一个变量或函数时,JavaScript引擎…

【每日一题】2788. 按分隔符拆分字符串-2024.1.20

题目: 2788. 按分隔符拆分字符串 给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。 注意 separator 用于决定拆分发生的位…

六个顶级的Python可视化项目

如果你是Python可视化的新手,一些流行的可视化库包括Matplotlib、Seaborn、Plotly、Bokeh、Altair和Folium,以及大量的库和例子可能会让你感到不知所措。 当可视化一个DataFrame时,选择使用哪个可视化库确实是一个头疼的事情。 这篇文章云朵…

输出一个水仙花数

思路: 1.对当前数字i,进行拆解 2.获得百位、十位、个位 3.判断每位立方之和是否等于原数字i package com.ztt.Demo02Exercise;public class test04 {/** 水仙花数*/public static void main(String[] args) {daffodilNumber();}public static void daffo…

pyqt5写一个图形化的文本处理软件

参考资料https://www.zhihu.com/column/pyqt5 最终效果软件 导入安装包 pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools -i https://pypi.douban.com/simple要使用PyQt5编写一个文本处理程序,你可以按照以下步骤进行&#xff1a…

【C语言】linux内核ipoib模块 - ipoib_send

一、ipoib_send函数定义 int ipoib_send(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_tx_buf *tx_req;int hlen, rc;void *phead;unsigned int usable_sge priv->max_sen…

图片验证码+短信验证码

图片验证码短信验证码 图片验证码短信验证码 图片验证码 在调用接口的时候,只要触发了这个接口,就要换验证码(无论成功与否) if (!redisDao.deleteKey(phKey)) {throw new CustomException("验证码错误");}短信验证码 在短信验证的时候&…

基于python socket实现TCP/UDP通信

两个应用程序如果需要进行通讯最基本的一个前提就是能够唯一的标示一个进程,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中…