【Redis进阶】RDB持久化策略

news2024/10/6 16:19:40

1. 浅谈持久化

持久化:能够在重启主机/进程的时候,将数据从硬盘中恢复到内存的特性。
持久化相信大家都是不陌生的,毕竟MySQL中事务ACID四大特性中就包含持续性这样的特点,所谓持久化,本质上就是将数据保存在硬盘上;不持久化就意味着将数据保存在内存中。
Redis的持久化机制:对于Redis而言,将数据保存在内存中是其效率高的重要原因,但是为了保证数据的可靠性,Redis也提供了持久化机制。那么问题来了,Redis的持久化机制会影响到Redis的性能吗?大概率是不会的,因为Redis查询数据的时候仍然是从内存中读取,只是额外将数据多保存了一份在硬盘上,额外内存开销也没有很大,Redis具体提供了RDB、AOF两种机制进行持久化。

2. RDB机制

RDB(Redis DataBase):简单来说,Redis会定期的将内存的全量数据生成一个快照(dump.rdb文件),然后保存在硬盘中。
这个快照就类似于警察到达案发现场后,就会在周围设立警戒线,然后拍照保存现场状态。当Redis遇到特殊情况(断电)进程异常退出后,尽管内存数据丢失,仍旧可以通过这个快照文件进行恢复

2.1 RDB触发时机

RDB的触发时机有两种情况:

  1. 手动触发:即通过客户端命令的方式执行生成快照的过程
    1. save命令:当执行save命令后,redis服务器就会全力以赴的生成这个RDB快照文件,进而阻塞其余redis客户端命令的执行(不推荐×)
    2. bgsave命令:即通过后台方式运行,此处redis服务器会fork出一个子进程,然后由子进程完成生成RDB快照的任务,此时主进程仍然可以处理其余的redis客户端命令
  2. 自动触发:在redis的配置文件(redis.conf)配置经过多长时间 / 经过多少次修改。

关于RDB快照文件的存储位置在redis的配置文件(redis.conf)中有明确定义:
image.png
此处我的云服务器默认dump.rdb文件就生成在./的工作目录下,当我们使用vim dump.rdb查看这个文件
image.png
我们观察该文件的格式,可以发现该RDB文件是一个二进制文件,后续redis重启后,就会尝试该文件,如果格式出现错误,就有可能会出现加载失败!

由于dump.rdb文件非常重要,因此不要随意修改!redis还提供了一些客户端命令例如redis-check-rdb等用于检查rdb文件是否正确

总结:

  • redis默认开启了RDB策略,会自动生成dump.rdb快照文件,该文件路径可以在配置文件redis.conf目录进行配置
  • dump.rdb文件是一个二进制压缩文件
  • 可以通过手动触发/自动触发两种方式来生成RDB镜像文件

2.2 bgsave执行流程

当redis服务器处理bgsave命令就会执行以下流程:

执行流程:

  1. 服务器接收bgsave命令
  2. 服务器主进程就会fork出一个子进程,此时主进程可以继续执行其余客户端命令
  3. 子进程具有和父进程相同的内存数据,就可以依据这些数据生成rdb二进制文件(存放在一个临时文件中),处理完后才会将新的临时文件覆盖原先的rdb文件
  4. 当子进程任务完成之后就会使用信号机制通知父进程

2.3 RDB自动触发策略

由于rdb文件并不是实时更新的,因此我们还需要查看redis.conf配置的触发条件:
image.png
上述配置项就配置了RDB的触发策略:save 经过时间 修改次数,因此上面三项配置就是:

  • 在3600s内修改次数达到1次,就会在3600s(1小时)生成RDB文件
  • 在360s内修改次数达到100次,就会在300s(5分钟)生成RDB文件
  • 在60s内修改次数达到10000次,就会在60s(1分钟)生成RDB文件

事实上我们可以在配置项中任意更改,但需要满足一定条件:生成RDB的频率不能太高,因为生成一次RDB快照需要将内存中的全量数据全部压缩,成本比较大

RDB的缺点:正是因为RDB采用的是每隔一定时间进行RDB快照生成,例如如果配置为save 5 1,那么当前执行过一次RDB策略,但是接下来5min之类有大量请求涌入,就在某一刻,系统断电了,此时RDB文件没有进行更新,导致了数据不一致的情况

2.4 实操

理论大致讲完了,现在我们进行实操验证:
场景一:手动执行save/bgsave生成快照

127.0.0.1:6379> set k1 111
OK
127.0.0.1:6379> set k2 222
OK
127.0.0.1:6379> set k3 333
OK
127.0.0.1:6379> bgsave
Background saving started

image.png
当我们尝试强制杀死redis进程的时候,重启redis服务,观察能否恢复内存数据:

[root@VM-16-5-opencloudos redis]# ps -aux | grep 6379
redis        672  0.1  0.2 136452  5108 ?        Ssl  Jun11   6:39 /www/server/redis/src/redis-server 0.0.0.0:6379
root     2667081  0.0  0.1   6792  2048 pts/0    S+   14:58   0:00 grep --color=auto 6379
[root@VM-16-5-opencloudos redis]# kill -9 672
[root@VM-16-5-opencloudos redis]# systemctl restart redis
[root@VM-16-5-opencloudos redis]# redis-cli
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"

可以看到内存数据已经被恢复到内存中了!
场景二:插入新数据后不执行bgsave命令

127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"
127.0.0.1:6379> set k4 444
OK
127.0.0.1:6379> exit
[root@VM-16-5-opencloudos redis]# ps -aux | grep redis
redis    2667513  0.1  0.6 136452 11640 ?        Ssl  14:59   0:01 /www/server/redis/src/redis-server 0.0.0.0:6379
root     2673606  0.0  0.1   6792  2048 pts/0    S+   15:11   0:00 grep --color=auto redis
[root@VM-16-5-opencloudos redis]# kill -9 2667513
[root@VM-16-5-opencloudos redis]# systemctl restart redis
[root@VM-16-5-opencloudos redis]# redis-cli
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

此时就可以证明redis是根据dump.rdb快照文件恢复数据的,但是其中没有新添加的k4信息,因此不会恢复到内存中

这里需要注意:我们必须要通过kill -9的方式杀死进程,如果使用一些例如systemctl stop redis等命令,redis会在shutdown之前进行生成RDB的过程,如下几种方式都可以生成RDB快照

  1. 执行save/bgsave/自动触发
  2. 进行主从复制
  3. 执行shutdown等命令

场景三:观察执行bgsave文件替换过程
前面我们提到过,当执行bgsave命令时子进程会将数据文件存放到临时文件中,然后再替换原有的RDB文件,我们可以通过Linux文件系统的stat命令查看文件inode编号:

[root@VM-16-5-opencloudos redis]# stat dump.rdb
  File: dump.rdb
  Size: 2151      	Blocks: 8          IO Block: 4096   regular file
Device: 252,1	Inode: 829479      Links: 1
[root@VM-16-5-opencloudos redis]# redis-cli
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> exit
[root@VM-16-5-opencloudos redis]# stat dump.rdb
  File: dump.rdb
  Size: 2151      	Blocks: 8          IO Block: 4096   regular file
Device: 252,1	Inode: 819717      Links: 1

可以发现dump.rdb文件的编号已经发生了改变

补充:在Linux上常见的文件系统组织方式(ext4)将整个文件系统分为了以下三大部分:

  1. 超级块(存放一些管理信息)
  2. inode区(存放inode节点,每个文件都会被分配一个inode数据结构,存放各种元数据信息)
  3. block区(存放文件的具体数据内容)

场景四:通过配置自动生成RDB
image.png
新增配置项:save 10 1(注意:更改完配置文件后一定要重启redis服务)

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set k1 111
OK
127.0.0.1:6379> exit

在10s后重新观察dump.rdb文件就可以发现重新执行了RDB生成过程
场景五:故意改坏RDB文件,观察启动现象
当我们尝试在dump.rdb中间修改一些数据,使用kill -9 强制杀死redis服务,就会出现启动失败的现象,查看日志文件redis.log(在配置文件redis.conf可以配置)
image.png
我们也可以通过一些客户端工具,例如redis-check-rdb检查RDB文件格式:
image.png

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

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

相关文章

PFA 反应罐内衬特氟龙 润滑绝缘行业加工 匠心工艺

PFA反应罐别名也叫反应瓶,储样罐,清洗罐等。可作为样品前处理实验中消解样品和中低压溶样的反应容器,广泛应用于半导体分析、新材料、新能源、同位素分析等。 PFA反应罐规格参考:250ml、300ml、350ml、500ml、1L等。 产品特点&…

python爬虫爬电影数据

使用python 爬了下豆瓣电影,仅供学习。 目标链接主页 获取div内容 保存爬出来的数据

【网络编程】多进程服务器端

并发服务器的实现 多进程服务器:通过创建多个进程提供服务多路复用服务器:通过捆绑并统一管理IO对象提供服务。多线程服务器:通过生成与客户端等量的线程提供服务。、 理解进程process 定义:占用内存空间的正在运行的程序。 CPU核和进程数:1个CPU 中…

甘肃这款饼子很火 你是否有吃过呢

白吉饼那独特的外形,圆圆的十分可爱。👏它的表皮酥脆,内里绵软,麦香四溢。😋拿在手里沉甸甸的,就知道用料十足。 无论是直接吃,感受那纯粹的面香,还是夹上腊汁肉,变成美味…

【日记】常去的那家饭馆转让了……(399 字)

正文 晚上吃饭,常去的那家饭馆门市转让了,不做了。sad。 不久之前,临近下班了,我忘了报一个表给副行长,那时候系统已经进不去了,查不了数据。于是我随便转发了一张以前的日报表给他,日期都没改。…

面试官考我Object类中的所有方法及场景使用?我...

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java 知识点啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯&a…

Mac M3 Pro 部署Spark-2.3.2 On Hive-3.1.3

mac的配置如下 1、下载安装包 官网 Apache Projects Releases 在search中搜索hadoop、hive spark : Index of /dist/spark/spark-2.3.2 网盘 Hadoop https://pan.baidu.com/s/1p4BXq2mvby2B76lmpiEjnA?pwdr62r 提取码: r62r Hive https://pan.baidu.com/s/…

c++的lamda表达式

作用: 弥补了main函数里面不可以定义函数的缺陷&#xff0c;减少了全局变量的声明 可以在main里面搭建小的构件&#xff0c;如下&#xff1a; #include<bits/stdc.h> #define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define int long long #define loop…

rsa加签验签C#和js、java、微信小程序互通

js实现rsa加签验签 https://github.com/kjur/jsrsasign 11.1.0版本 解压选择需要的版本&#xff0c;这里选择all版本了 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>JS RSA加签验签</title&g…

Java——变量作用域和生命周期

一、作用域 1、作用域简介 在Java中&#xff0c;作用域&#xff08;Scope&#xff09;指的是变量、方法和类在代码中的可见性和生命周期。理解作用域有助于编写更清晰、更高效的代码。 2、作用域 块作用域&#xff08;Block Scope&#xff09;&#xff1a; 块作用域是指在…

SQLserver前五讲课堂笔记

第一讲 基本内容 为什么要学习数据库系统?什么是数据库?什么是数据库系统?什么是数据库管理系统&#xff1f;本课程学什么以及学到什么程度? 重点难点 一组概念的区分&#xff1a;数据库、数据库系统和数据库管理系统熟悉表 的相关要素及术语熟悉数据库系统的构成(工作…

Springboot项目ES报异常query_shard_exception

详细异常信息如下&#xff1a; {"error": {"root_cause": [{"type": "query_shard_exception","reason": "failed to create query: {\n \"bool\" : {\n \"filter\" : [\n {\n \…

【docker hub镜像源失效】2024年6月6日 docker 国内镜像源失效

文章目录 概述中科大镜像源阿里镜像源其他镜像源可用的镜像源写在最后 之前违反社区规定了&#xff0c;做了和谐 概述 大家都知道使用docker hub官方镜像需要魔法&#xff0c;虽然大部人有魔法&#xff0c;但是网速也是很慢&#xff0c;还有部分同学没有&#xff0c;全靠国内各…

Linux-Https协议

文章目录 前言一、Https协议二、常见的加密方式对称加密非对称加密数据摘要&&数据指纹中间人攻击 三、Https的加密历程方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密 前言 之前我们学习了Http协议&#xff0c;也试着…

Bug:SSH Failed Permission Denied(完美解决)

Bug&#xff1a;SSH Failed Permission Denied&#xff08;完美解决&#xff09; 今天我本机mac通过ssh访问linux服务器时报错&#xff1a;SSH Failed Permission Denied 思路&#xff1a; linux服务器sshd是否开启linux /etc/ssh/sshd_config配置是否正确&#xff08;是否开启…

YouTube583美元账户做到一千多万美元,125万粉的顶级交易员

油管125万粉丝的Ross Cameron,一位把583美元账户做到一千多万美元。他说他曾经也是像无头苍蝇一样交易,最终凄惨爆仓,也就是在爆仓之后,他终于开始沉下心来研究交易策略,终于终于,他有一天找到了交易模型,并用它执行至今。 Ross Cameron无疑是最成功的日内交易员之一,而…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

&#x1f340;简介 Options是.net Core Web api框架自带的功能&#xff0c;Options模式通过定义强类型的类来表示相关配置设置的集合&#xff0c;使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

Linux基础 (十八):Libevent 库的安装与使用

目录 一、Libevent 概述 1.0 Libevent的安装 1.0.1 使用源码方式 1.0.2 终端命令行安装 1.1 主要特性 1.2 主要组件 1.3 Libevent 使用模型 1.4 原理 1.5 使用的基本步骤 1.5.1 初始化事件基础设施 1.5.2. 创建和绑定服务器套接字 1.5.3. 设置监听事件 1.5.4. 定义…

电脑缺失d3dcompiler_47.dll会怎么样,该如何修复呢

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dcompiler47.dll文件”。那么&#xff0c;d3dcompiler47.dll到底是什么&#xff1f;为什么计算机会缺失它&#xff1f;它会对电脑产生什么具体影响&#xff1f;如何解决这个问题&…

【CT】LeetCode手撕—25. K 个一组翻转链表

目录 题目1-思路2- 实现⭐25. K 个一组翻转链表——题解思路 3- ACM实现 题目 原题连接&#xff1a;25. K 个一组翻转链表 1-思路 1. dummyHead&#xff1a;设置虚拟头结点&#xff0c;通过虚拟头结点保证每个结点的地位相同2. 定位 pre 和 end 拆链&#xff1a;借助 pre 、s…