redis持久化之RDB

一、什么是RDB

RDB(Redis Database)是redis持久化数据的一种方式。

二、生成RDB文件

2.1 文件生成策略

Redis首先会生成一个rdb临时文件,当持久化完成之后,将临时文件覆盖之前的rdb文件。
Redis会默认在redis的根目录生产“dump.rdb”文件。

2.2 save命令

127.0.0.1:6379> save
OK

该命令为同步命令,即同步时会阻塞其他命令

2.3 bgsave

127.0.0.1:6379> bgsave
Background saving started

bgsave命令会在后台生成一个子进程来进行数据持久化。

  1. 用户执行bgsave命令
  2. redis使用fork()函数生成子进程
  3. 返回客户端“Background saving started”
  4. 子进程在后台创建RDB文件

第二步fork创建子进程的过程是同步执行的,一般情况下,这一步是非常快的,也有少数情况,这一步比较慢,如果比较慢,就会阻塞主进程

注意:

当执行bgsave时,会生成当前redis的内存快照,即将redis整个数据拷贝一份,所以当前redis占用内存会乘2,要保证有足够的内存。

2.4 save与bgsave对比

命令savebgsave
IO类型同步异步
阻塞是(执行fork时阻塞)
时间复杂度O(n)O(n)
优点不消耗额外内存不阻塞命令端命令
缺点阻塞客户端命令需要fork,消耗内存

三、自动生成rdb文件

在Redis中,有如下配置:

save=900 1          # 当900秒内发生1条及以上数据变化,则会自动执行bgsave命令
save=300 10         # 当300秒内发生10条及以上数据变化,则会自动执行bgsave命令
save=60 10000       # 当60秒内发生10000条及以上数据变化,则会自动执行bgsave命令
...                 # 该配置可以配多个

四、rdb相关配置

# 生成的rdb文件的名称,默认为dump.rdb
dbfilename=dump.rdb

# rdb文件存放的位置,默认是当前目录
dir=./

# 当bgsave发生错误时,是否停止写入
stop-writes-on-bgsave-error=yes

# rdb文件是否采用压缩格式
rdbcompression=yes

# 是否对rdb文件进行校验和的检测
rdbchecksum=yes

五、其他触发RDB文件生成的条件

1. 全量复制

当进行主从全量复制时,会生成rdb文件进行全量复制。

2. debug reload

当执行该命令时,会生成rdb文件

该命令会save当前的rdb文件,并清空当前数据库,重新加载rdb,加载与启动时加载类似,加载过程中只能服务部分只读请求(比如info、ping等)

3. shutdown

当关闭时,会生成rdb文件


六、RDB存在的问题

6.1 耗时、耗性能
  1. 每次拷贝都是全量拷贝,时间复杂度为O(n),消耗时间,CPU、IO。
  2. bgsave会fork出子进程,并且会对当前redis使用copy-on-write策略进行内存拷贝,比较消耗内存。尤其是在写量非常大的情况下。
6.2 不可控、丢失数据

RDB相当于备份当前时间的数据。那样的话,如果redis宕机,那么在上次开始备份到宕机这个时间段的数据就会丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iioSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值