redis--15--持久化--RDB

redis–15–持久化–RDB


1、 RDB是什么

将数据写入到磁盘里面

1.1、持久化时

在指定的时间间隔内将内存中的 数据集快照 写入磁盘, 也就是Snapshot快照,

1.2、恢复时

将快照文件直接读到内存里。

2、rdb的工作原理

  1. Redis单独创建一个子进程(fork函数)
  2. 子进程将Redis数据写入一个临时文件中
  3. 写入数据结束后,再用这个临时文件替换上次的rdb文件。
  4. 整个过程中,父进程是不进行任何IO操作的

2.1、 Fork

  1. fork函数复制一个与当前进程(父进程)一样的进程(子进程)。
    1. 在使用fork函数那一刻(T1),父子进共享同一内存数据
      1. 父子进程所有数据(变量、环境变量、程序计数器等)一致
  2. 当父进程是否要对内存的数据做修改
      1. 操作系统会对内存中要修改的数据进行备份,保证子进程的数据是T1时刻的数据,这叫"写时复制技术"
      1. 父进程和子进程会共用同一段物理内存,

2.2、 RDB持久化流程

redis--15--持久化--RDB_第1张图片

3、优缺点

3.1、缺陷

  1. Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
  2. 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
  3. 如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。

3.2、优点

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

  1. 适合大规模的数据恢复
  2. 对数据完整性和一致性要求不高更适合使用
  3. 节省磁盘空间
  4. 恢复速度快

redis--15--持久化--RDB_第2张图片

4、配置

# rdb文件名称
dbfilename dump6379.rdb

# rdb文件的保存路径,要事先创建好
dir /redis/data/

# 900秒内改了1次。触发rbd
save 900 1    

# 300秒内改了10次。触发rbd
save 300 10  

# 60秒内改了1万次。触发rbd
save 60 10000  

# 后台快照持久化发生错误时,客户端停止向服务端写操作。
stop-writes-on-bgsave-error yes    

# 对于存储到磁盘中的快照,是否进行压缩存储。
# yes:采用LZF算法进行压缩。
rdbcompression yes    

# 在存储快照后,让redis使用CRC64算法来进行数据校验,会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能,
# 推荐yes
rdbchecksum yes   
 

 

5、触发rbd的场景

5.1、根据save规则发生rdb

  1. 按照规则定时将内存数据存储到硬盘中
  2. 每隔N分钟或N次写操作后, 从内存dump数据形成rdb文件

格式

save 秒钟 写操作次数

默认配置

# 3600秒内改了1次。触发rbd
save 3600 1    

# 300秒内改了10次。触发rbd
save 300 10  

# 60秒内改了1万次。触发rbd
save 60 10000  

测试

# 10秒内改了1次。触发rbd
save 10 1    

# 300秒内改了10次。触发rbd
save 300 10  

# 60秒内改了1万次。触发rbd
save 60 10000  

redis--15--持久化--RDB_第3张图片

5.2、 save,bgsave 命令

为了测试,我们将 5.1的配置改为默认配置

# 900秒内改了1次。触发rbd
save 900 1    

# 300秒内改了10次。触发rbd
save 300 10  

# 60秒内改了1万次。触发rbd
save 60 10000  

执行save

测试前将dump6379.rdb文件删掉

在这里插入图片描述

redis--15--持久化--RDB_第4张图片

执行bgsave

测试前将dump6379.rdb文件删掉

在这里插入图片描述

redis--15--持久化--RDB_第5张图片

5.2.1、 save,bgsave区别

save

  1. save是手动持久化。而且只管持久化,其它不管,会阻塞来自客户端的请求
  2. 不建议使用

bgsave

  1. 在后台异步进行持久化操作, 持久化同时还可以响应客户端请求。
  2. 可以通过 lastsave 命令获取最后一次成功执行快照的时间

redis--15--持久化--RDB_第6张图片

5.3、 flushall命令

测试前将dump6379.rdb文件删掉

在这里插入图片描述

redis--15--持久化--RDB_第7张图片

5.4、主从复制(replication)

发生在主从复制场景,即使没有定义save配置规则,并且也没有手动执行快照,也会生成rdb快照文件

6、rdb的备份和恢复

原理

redis启动后会自动读取rdb文件,将数据从硬盘加载到内存中

6.1、备份步骤

通过redis.conf配置文件,找到rdb文件目录,通过cp命令进行备份

cp dump6379.rdb  dump6379.rdb.back


redis--15--持久化--RDB_第8张图片

6.1、恢复步骤

1. 关闭redis

2. 删掉dump6379.rdb

3. dump6379.rdb.back 改为 dump6379.rdb

redis--15--持久化--RDB_第9张图片

4. 启动Redis, 备份数据会直接加载

redis--15--持久化--RDB_第10张图片

7、动态停止RDB

#save后给空值,表示禁用保存策略
127.0.0.1:6379> config set save ""

8、总结

redis--15--持久化--RDB_第11张图片

你可能感兴趣的:(redis,redis,缓存,数据库)