当前位置: 首页 > article >正文

redis RDB持久化技术

为什么需要持久化?

 Redis作为一个内存数据库,数据是以内存为载体存储的,即所有数据都保存在内存中。一旦Redis服务器进程退出或宕机,即便重启redis服务,数据也会全部丢失。为了解决这个问题,Redis提供了持久化机制,说白了就是把数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据!

redis中的持久化技术

★ Redis提供2种持久化方案:

  • RDB   将在内存中的数据库记录定期生成快照存入磁盘中
  • AOF   将Reids的操作日志以追加的方式写入文件,

一个是快照的方式,一个是类似日志追加的方式

什么是RDB?
RDB 就是 Redis DataBase 的缩写,中文名为快照/内存快照。RDB是一种快照存储持久化方式,原理就是将Redis某一时刻的内存数据写入到RDB文件中,并保存到磁盘上。


该文件是一个压缩过的二进制文件,默认文件名为dump.rdb,通过该文件可以还原redis数据库的数据。在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中,达到恢复数据目的。

 ★ 可根据 redis.conf 配置文件中设置rdb文件名 和 保存目录:

# 指定本地数据库文件名(rdb文件的名称),默认值为dump.rdb
dbfilename dump.rdb
 
# 指定本地数据库存放目录(dump.rdb文件存放目录),rdb、aof文件也会写在这个目录
dir /usr/local/var/db/redis/
——既然RDB持久化的方式是生成RDB文件,那么RDB文件是怎么生成的呢?

触发RDB文件生成的方式:

手动触发:通过命令手动生成快照
自动触发:通过配置参数的设置触发自动生成快照
★ 手动触发
执行save 和 bgsave命令,可以手动触发快照,生成RDB文件

1、save 
当某个客户端发送 save 命令后,此时会阻塞当前Redis服务器,在RDB文件创建完成之前是不能处理其他客户端发送的任何命令请求,如果数据量太大会造成长时间阻塞,期间redis无法处理其他请求,线上环境不建议使用。如下图所示:

2、bgsave 
当某个客户端发送 bgsave 命令后,Redis服务器会执行fork() 函数创建一个子进程,由子进程负责rdb文件创建和写入,期间服务器不会阻塞,可以接受其他客户端的命令请求,但在fork执行阶段,服务器还会阻塞,无法接受其他客户端命令(一般时间很短!)如下图所示:

 ✸ 具体流程如下:

Redis客户端执行bgsave命令 或 自动触发bgsave命令;
父进程先判断:当前是否在执行save,或bgsave/bgrewriteaof(aof文件重写命令)的子进程
如果存在:则父进程直接返回。 如果不存在:父进程执行fork操作创建一个子进程,fork过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
fork完毕后返回 “ Background saving started” 信息并不再阻塞父进程,并可响应其他命令
子进程创建临时RDB文件,待数据写入完毕后,对原有文件进行原子替换;
同时子进程退出,并发送信号给父进程表示完成rdb持久化,父进程更新统计信息
注意:bgsave/bgrewriteaof(rdb/aof) 的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。

✶ 简化后的流程可分为三步:

服务器接收bgsave命令,主线程需调用系统的 fork() 函数,构建一个子进程去操作;
子线程创建好RDB文件并退出时,向父进程发送信号,告知RDB文件创建完毕;
父进程接收子进程创建好的RDB文件,bgsave命令执行结束


Redis服务器在处理bgsave采用子线程进行IO写入,而主进程仍然可以接收其他请求,但forks子进程是同步阻塞的,在forks子进程阶段,不能接收其他请求,如果forks一个子进程花费的时间太久(一般是很快的),bgsave命令仍然有阻塞其他客户的请求的情况发生

★ 自动触发
在以下几种情况时会自动触发生成RDB文件:

redis.conf 配置文件中达到save参数条件
主从复制时,从节点要从主节点进行全量复制时也会触发bgsave,生成快照发送到从节点
执行shutdown,如果没有开启aof持久化,会触发bgsave
执行 flushall (生成空的dump.rdb!)
特别注意:flushall 是删库跑路,生成一个空的dump.rdb文件,目的是覆盖并删除上次备份产生的dump.rdb,防止重启Redis时,数据又会恢复到上一次备份的时候的数据!!


http://www.kler.cn/a/389458.html

相关文章:

  • 实现 MVC 模式
  • FreeRTOS学习13——任务相关API函数
  • 软件测试面试题(800道)【附带答案】持续更新...
  • linux 下查看程序启动的目录
  • Linux设置Nginx开机启动
  • jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息
  • mysql第二次作业---单表和多表查询
  • Rust性能优化与调试之性能基准测试
  • 如何使用SparkSQL在hive中使用Spark的引擎计算
  • 全网最详细的自动化测试(Jenkins 篇)
  • 企业知识库管理系统的创新模式及其智能化转型
  • 45期代码随想录算法营总结
  • 股票短线的建议(学习)- 20241111
  • .net core开发windows程序在国产麒麟操作系统中运行
  • catchadmin-webman 宝塔 部署
  • web——[SUCTF 2019]EasySQL1——堆叠注入
  • Oracle OCP认证考试考点详解082系列18
  • HTTP协议基础
  • 【报错记录】Steam迁移(移动)游戏报:移动以下应用的内容失败:XXX: 磁盘写入错误
  • 时序预测 | gamma伽马模型锂电池寿命预测 EM算法粒子滤波算法结合参数估计
  • 健身房业务流程优化:SpringBoot解决方案
  • Python面试题一
  • FBX福币交易所创指半日涨1.95%,中兴通讯直线涨停
  • Flume学习
  • 模块与包的应用
  • UE5遇到问题记录