【Redis】Redis RDB持久化

一、持久化简介

什么是持久化?

将内存中的数据保存至永久性存储介质称为持久化

为什么要持久化?

防止数据的意外丢失,确保数据安全性

如何防止数据丢失?

  • RDB:快照形式,保存当前数据状态,存储数据结果,存储格式简单,关注点在数据
  • AOF:日志形式,保存数据的操作过程,存储操作过程,存储格式复杂,关注点在数据的操作过程

二、数据快照RDB

1. save指令

使用save指令即可通过RBD方式进行数据持久化,需要手动执行save操作,持久化时会把redis中的数据默认保存在dump.rdb中,可在配置文件中指定目录

客户端在内存创建数据,并进行save持久化

查看指定dump.rdb中是否有内容

这就表示内存中的数据已经保存在硬盘文件里了

2. RDB文件相关配置

lua 复制代码
dbfilename dump.rdb
  • 说明:设置本地数据库文件名,默认为dump.rdb
  • 经验:通常设置为dump-端口号.rdb
bash 复制代码
dir
  • 说明:设置存储.rdb文件的路径
  • 经验:通常设置成存储空间较大的目录中,目录名称data
bash 复制代码
rdbcompression yes
  • 说明:设置存储至本地数据库时是否压缩数据,默认为yes,采用LZF压缩
  • 经验:通常默认为开启状态,如果设置成no,可以节省CPU运行时间,但会使存储的文件变大(巨大)
bash 复制代码
rdbchecksum yes
  • 说明:设置读写.rdb文件时是否进行RDB文件的校验,该校验过程在写文件和读文件过程均进行,避免读写已损坏的文件
  • 经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存储一定的数据损坏风险
vbnet 复制代码
stop-writes-on-bgsave-error yes
  • 说明:后台存储过程中如果出现错误,是否停止保存操作
  • 经验:通常默认为开启状态

修改配置后,需要重启服务程序才能生效,重启后将按照配置文件指定的文件路径和工作方式运行

验证save后数据保存在了rdb文件

服务端杀掉进程后,重新使用配置文件启动

客户端创建两个数据并save

查看rdb文件,已有相关记录

验证重启服务后,程序会从rdb文件中恢复数据到内存

客户端重新连接,发现数据还存在,这是因为服务进程启动时读取了rdb文件,进而恢复到内存中

3. bgsave指令

Redis是单线程的,所有命令都会在队列中排好队,不建议使用save指令,因为save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成,有可能会造成长时间阻塞,线上环境不建议使用

访问量很大时,单线程又得执行save,还得处理客户请求,造成效率降低,如何处理?

用bgsave解决:客户端发送bgsave后,redis会选择一个合适的时间执行后台执行,并不是像save一样收到指令立即执行

注意: bgsave命令是针对save阻塞问题做的优化,Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用

验证bgsave工作原理

客户端发送bgsave,可以看到给我们提示的是Background saving started

我们查看RDB文件,已经数据addr保存好了

我们查看一下日志文件(配置文件中的logfile)

4. 配置自动持久化

到目前为止,save和bgsave都是手动的保存指令,那么会引入以下问题:

  • 反复执行保存命令,忘记了怎么办?
  • 不知道数据产生了多少变化,何时保存?

Redis提供了一种自动进行数据持久化的方式:指定时间范围内,发生变化(这个变化包括增加、修改、删除)的key达到指定数量就进行持久化,需要在配置文件中进行一下配置:

sql 复制代码
save second changes
  • second:监控时间范围
  • changes:监控key的变化量
bash 复制代码
save 900 1        # 900s内有1个key发生变化,则进行bgsave持久化
save 300 10       # 300s内有10个key发生变化,则进行bgsave持久化
save 60 10000     # 60s内有10000个key发生变化,则进行bgsave持久化

修改配置conf文件

启动服务程序

客户端添加一个数据

查看服务器是否进行了持久化(rdb文件已提前清空)

客户端再添加一条数据,此时服务器按照配置文件,自动执行bgsave

此时服务器的rdb文件已经出现

无论get多少次,数据都不会改变,不会进行持久化;由于不进行数据比对,也就意味着对同一个数据连续修改两次,也会进行持久化

save使用注意事项:

  • save配置要根据实际业务情况进行设置,持久化的频度过高或过低都会出现性能问题,结果可能是灾难性的
  • save配置中对second与changes设置通常具有互补对应关系,尽量不要设置成包含性关系
  • save配置启动后执行的是bgsave操作

5. RDB三种启动方式对比

由于配置文件启动save的方式,执行的就是bgsave,这里只比较save和bgsave

  • save:由单进程执行,是同步的;save和其他的客户端请求都是排队处理的,若执行时间过长会阻塞其他指令;没有fork子进程,无额外内存消耗
  • bgsave:由子进程执行,主进程可以继续处理其他请求,不会阻塞其他指令,是异步的,同时有额外内存开销(子进程)

6. rdb特殊启动形式

  • 全量复制(在主从复制中用到)
  • 服务器运行过程中重启
lua 复制代码
debug reload
  • 关闭服务器时指定保存数据
arduino 复制代码
shutdown save

7. RDB优缺点

RDB优点

  • RDB是一个紧凑压缩的二进制文件,存储效率较高
  • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
  • RDB恢复数据的速度要比AOF快很多
  • 应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复

RDB缺点

  • save频率低容易丢数据,save频率高会影响请求处理速度
  • bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能
  • Redis的众多版本中未进行RDB文件格式的版本不统一,有可能出现这个版本的redis生成的rbd文件,用其他版本的redis打不开

RDB存储的弊端

  • 存储数据量较大,效率较低------基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低
  • 大数据量下的IO性能较低
  • 基于fork创建子进程,内存产生额外消耗
  • 宕机会带来数据丢失
相关推荐
IT_陈寒13 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码14 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo15 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志15 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..15 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects16 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰16 小时前
一些基础和问题解决
后端
陈随易16 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN16 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana16 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端