深入浅出Redis(四):Redis基于RDB、AOF的持久化

引言

Redis是一款基于内存的键值对数据结构存储系统,Redis基于内存且常用来缓存关系型数据库中的数据,但不代表着Redis不能进行持久化,本篇文章将深入浅出的说明Redis基于RDB和AOF的持久化方式

Redis支持两种持久化方式,RDB(Redis Database )是基于快照的方式,在服务端初始化时根据快照RDB文件进行数据恢复,而AOF(Append Of File)是记录命令的方式,在服务端初始化时使用AOF伪客户端通过AOF文件依次发送命令,服务端来执行以此来恢复数据

RDB

RDB文件格式

RDB文件是二进制数据,格式主要分为数据内容和其他信息

databases字段包含多个数据库的数据,其中selectdb 0用于切换数据库,key_value_pairs用于保存数据类型(type),键值对数据(key,value),如果是过期数据则会有记录到期时间(expiretime ms)

其他数据包括REDIS用于该文件是否为RDB文件、db_version表示版本号、EOF在databases字段后表示数据内容结束、check_sum用于校验RDB文件是否损坏

image.png

RDB原理

使用save命令主进程生成RDB文件,造成对主进程的阻塞,所以不会使用这种命令

使用bgsave命令fork子进程进行持久化,子进程通过遍历数据库读取数据文件写入RDB文件,在此期间父进程可能接收写操作,写操作时使用Copy on write技术

Copy On Write:父进程fork子进程时,是将父子进程共享数据,共享数据是只读的,当要发生写操作时会触发中断,并将页数据复制生成副本给予子进程;COW有效避免了创建子进程时复制父进程数据,而是直接共享父进程数据,当发生写操作时发生中断生成副本给子进程,如果写操作太多也可能导致频繁生成副本

在实际情况中,我们也不会手动执行bgsave,而是在配置文件中进行配置,当满足条件时执行bgsave

配置save 60 10000 服务端会维护 修改累计次数和上次RDB时间 数据,定期检查如果满足60s有1W次写操作就自动执行bgsave,生成RDB文件后更新这俩个数据

注意:为了禁止RDB开销过大,会禁止同时生成RDB、AOF文件

RDB恢复数据

当服务端启动时,自动判断RDB文件是否存在,存在则使用RDB文件恢复数据,注意RDB文件要在Redis启动目录

将Redis服务进程杀死后重启,数据自动恢复

image.png

AOF

AOF默认是不开启的,在配置文件中使用yes启动,启动AOF代表着优先使用AOF而不是RDB

 #默认不开启aof模式
 appendonly no 
 #持久化文件名字
 appendfilename "appendonly.aof" 
AOF文件格式

AOF文件存储序列化后的写命令

 #*5表示该命令有5个字符   $5表示字符串长度 
 #命令为:RPUSH setresult tom-result cc-result jack-result
 *5
 $5
 RPUSH
 $9
 setresult
 $10
 tom-result
 $9
 cc-result
 $11
 jack-result
AOF原理

bgrewriteaof命令也是使用COW,fork子进程来遍历数据库记录序列化的写命令,在此期间父进程处理写命令后将写命令加入AOF缓冲区,再子进程完成AOF文件后整合AOF缓冲区中的写命令

实际也不会手动使用bgrewriteaof来生成AOF文件,根据配置文件中配置的策略来决定每次写操作

在事件循环中执行写命令会将写命令放入AOF缓冲区,在本次事件循环结束前将AOF缓冲区写入文件系统中(page cache),根据不同的策略有不同的时机刷盘(page cache的数据写入磁盘)

默认下使用everysec 每秒刷盘策略,如果发生宕机只会丢失一秒的数据,大多数情况下也使用的是这种策略

使用always 将会每次执行写命令进行刷盘,虽然不会丢失数据,但性能开销最大

使用no 将不会处理,将刷盘的时机交给OS处理,这也是性能最高的策略

如果业务不允许数据丢失则可以选择always策略;如果只是用Redis充当缓存,保存的数据库中都有,追求性能则可以选择no ;如果用Redis保存库中没有的数据且允许一秒丢失可以选择默认的everysec策略

 ​
 #每次修改都会同步,消耗性能
 #appendfsync always     
 ​
 #每秒同步一次,可能丢失这一秒的数据
 appendfsync everysec    
 ​
 #不同步,这时操作系统自己同步数据,速度最快
 #appendfsync no       
 ​
 no-appendfsync-on-rewrite no
 #自动执行AOF重写时,当前AOF大小(即aof_current_size)和上一次重写时AOF大小(aof_base_size)的比值
 auto-aof-rewrite-percentage 100 
 #执行AOF重写时,文件的最小体积,默认值为64MB
 auto-aof-rewrite-min-size 64mb 
AOF重写

AOF文件记录序列化后的写命令,体积占用比快照RDB文件大的多,但记录很多写记录时会导致体积非常大

写命令可能存在对键值对进行“覆盖”的操作

 #命令1
 set name caicai 
 #命令2
 set name cl
 ...
 #命令n
 set name liangzai

对于以上的键name来说,最终的值为liangzai,但是没有作用的命令1、2也记录在AOF文件中

当AOF体积与上次重写文件体积超过设置的比例时,对AOF文件进行重写“瘦身”压缩,也就是去除类似命令1、2这种命令

 #自动执行AOF重写时,当前AOF大小(即aof_current_size)和上一次重写时AOF大小(aof_base_size)的比值
 auto-aof-rewrite-percentage 100 
 #执行AOF重写时,文件的最小体积,默认值为64MB
 auto-aof-rewrite-min-size 64mb 
AOF恢复数据

当配置文件中开启AOF时就不再使用RDB恢复数据,RDB与AOF只能开启一种

在服务端启动时,使用AOF伪客户端发送命令给服务端,将AOF文件中的命令都执行一遍

需要注意的是AOF文件被恶意修改时,再启动redis客户端是无效的

使用redis-check-aof --fix 要修复的文件来进行修复,修复后会丢失被破坏的数据(假如我在appendonly.aof文件中修改了某个key,那就没有这个key的数据)

 [root@liang bin]# redis-check-aof --fix appendonly.aof 
 0x              30: Expected \r\n, got: 3131
 AOF analyzed: size=238, ok_up_to=23, diff=215
 This will shrink the AOF from 238 bytes, with 215 bytes, to 23 bytes
 Continue? [y/N]: y
 Successfully truncated AOF

总结

本篇文章围绕Redis的持久化,深入浅出的解析了RDB文件格式、执行原理、COW、恢复数据以及AOF文件格式、执行原理、重写、恢复数据等

RDB文件是默认情况下使用的持久化策略,常在配置文件中配置自动生成RDB的规则,在生成RDB时使用fork子进程与COW避免阻塞,是一种体积小恢复快的快照文件,但会丢失最后一次生成RDB文件后的写命令

COW让fork出的子进程不用复制资源,而是与父进程共享资源,当处理读操作时共享资源,只有感知到写操作时,发生页中断,将页中数据复制生成一份副本给子进程(父子进程都持有一份)

开启AOF持久化后优先使用AOF持久化,父进程处理写命令后将命令放入AOF缓冲区再放入文件系统pagecache中,根据不同刷盘策略有不同刷盘时机(默认每秒,no不管OS处理,always每次刷盘),文件中记录序列化后的写命令,体积太大时会执行AOF重做,恢复数据时由伪客户端发送AOF文件中所有命令,是一种体积大,恢复慢的文件,根据不同刷盘策略有不同的数据丢失量和性能损耗(成反比)

最后(一键三连求求拉~)

本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 缓存机制如何提高应用程序的性能?

在数字时代,一拍脑门儿我们就能感觉到信息的海量和处理速度的迫切。不管是刷个微博、下个单,还是玩个游戏,我们都希望能快上加快,一点不拖泥带水。这时候,缓存技术就扮演了个大英雄的角色,它能让数据存取的…

【排序】详解插入排序

一、思想 插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。具体步骤如下,将数组下标为0的元素视为已经排序的部分,从1开始遍历数组,在遍历的过程中当前元素从…

完美解决VMware中配置suse10虚拟机网络

一、注意!!!配置suse10网络,需要在虚拟机关机状态下进行,否则会配置不成功; 二、配置与主机在同一网段(仅主机模式,网卡一); 在suse系统关机状态下,Vmware中设置”虚拟网…

【每日一题】1976. 到达目的地的方案数-2024.3.5

题目: 1976. 到达目的地的方案数 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整数数组 roads ,其中 roads[i] = […

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用,gofly框架内置校验工具,提供开发效率,开发接口简单调用即可实现验证,下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

Java并发编程-进程和线程

一、进程和线程 1. 进程 什么是进程? 简单来说,进程就是程序的一次启动和执行。进程是操作系统中的一个概念,它代表正在运行的程序的实例。每个进程都有自己的内存空间、代码和数据,以及其他操作系统资源,如文件和设备…

数据结构与算法-希尔排序

引言 在计算机科学中,数据结构和算法是构建高效软件系统的基石。而排序算法作为算法领域的重要组成部分,一直在各种应用场景中发挥着关键作用。今天我们将聚焦于一种基于插入排序的改进版本——希尔排序(Shell Sort),深…

优思学院|质量和企业的盈利能力有何关系?

质量和企业的盈利能力有何关系?三十年前,这个问题就已经被提出。当时的学者们研究了高质量产品如何带来更高的盈利。虽然这听起来像是老生常谈,但它的真理至今仍深深影响着我们的商业决策。 为了更直观地理解,一些学者绘制了以下…

力扣大厂热门面试算法题 - 滑动窗口

最长和谐子序列、重复的DNA序列、找到字符串中所有字母异位词、滑动窗口最大值、最小区间。每题做详细思路梳理,配套Python&Java双语代码, 2024.03.06 可通过leetcode所有测试用例。 目录 594. 最长和谐子序列 解题思路 完整代码 Java Python …

亚信安慧AntDB:数据库自主创新的缩影

AntDB作为一款自主研发的数据库系统,具备了国产化升级改造的核心能力。这款数据库系统通过不懈努力和持续探索,实现了从跟随他人到引领潮流的华丽转身。AntDB不仅仅是一种技术产品,更是体现了自主研发能力的缩影,体现了科技企业在…

基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,…

Spring Test 常见错误

前面我们介绍了许多 Spring 常用知识点上的常见应用错误。当然或许这些所谓的常用,你仍然没有使用,例如对于 Spring Data 的使用,,有的项目确实用不到。那么这一讲,我们聊聊 Spring Test,相信你肯定绕不开对…

网络编程,IO多路复用

1.使用IO多路复用完成TCP并发服务器 #include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.124.10" //服务器IP地址int main(int argc, const char *argv[]) {//1、创建用于连接的套接字int sfd socket…

Elasticsearch从入门到精通-02环境搭建

Elasticsearch从入门到精通-02环境搭建 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f342;博主从本篇正式开始ES学习&#xff0c;希望小伙伴可以一起探讨 &#x1f4d6; 本篇主要介绍和大家一块学习一下ES环境搭建,主要包括Elasticsearch、…

材料物理 (HIT) 笔记-2

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 三…

mysql如何开启远程访问?

MySQL是一种常见的关系型数据库管理系统&#xff0c;广泛应用于各行各业。默认情况下&#xff0c;MySQL仅允许本地访问&#xff0c;即只能在本地主机上进行数据库操作。有时候我们需要通过远程连接访问MySQL数据库&#xff0c;以便实现更灵活的管理和操作。本文将介绍如何在MyS…

Docker快速入门和部署项目

1&#xff0c;Docker是一个&#xff0c;快速构建、运行、管理应用的工具 。 2&#xff0c;前面我们了解过在Linux操作系统的常见的命令以及如何在Linux中部署一个人单体的项目。感受如何呢&#xff1f;&#xff1f;&#xff1f; 命令太多了&#xff0c;记不住 软件安装包名字复…

java数据结构YZP专栏-----二叉树 平衡二叉树(AVL)

主文章&#xff08;数据结构的索引目录—进不去就说明我还没写完&#xff09;https://blog.csdn.net/grd_java/article/details/122377505 模拟数据结构的网站&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 源码(码云)&#xff1a;https://gi…

Python onnxruntime推理yolov5和yolov8(最简易版)

支持yolov5和yolov8双模型 其中ChtDeploy中代码如下&#xff1a; import onnxruntime import numpy as np import cv2class ChtDeploy():def __init__(self, img_path, onnx_path, iou_threshold0.45, conf_threshold0.3, detect_w640, detect_h 640):self.img cv2.imread(im…

【LeetCode每日一题】【BFS模版与例题】【二维数组】1293. 网格中的最短路径

BFS基本模版与案例可以参考&#xff1a; 【LeetCode每日一题】【BFS模版与例题】863.二叉树中所有距离为 K 的结点 【LeetCode每日一题】【BFS模版与例题】【二维数组】130被围绕的区域 && 994 腐烂的橘子 思路&#xff1a; 特殊情况&#xff1a; 最短的路径是向下再向…