【Redis从入门到进阶】第 9 讲:Redis 持久化之 —— RDB

奋斗吧
奋斗吧
擅长邻域:未填写

标签: 【Redis从入门到进阶】第 9 讲:Redis 持久化之 —— RDB JavaScript博客 51CTO博客

2023-04-09 18:23:51 241浏览

【Redis从入门到进阶】第 9 讲:Redis 持久化之 —— RDB,【Redis从入门到进阶】第9讲:Redis持久化之——RDB


本文已收录于专栏 ?《Redis从入门到进阶》?

专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习Redis,同时也是为了记录我自己学习Redis的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家 ?。

PS: AOF见专栏上文:Redis 持久化之 —— AOF

目录

  • 专栏前言
  • 1. RDB的持久化
  • 2. RDB 的使用
  • 2.1 save命令
  • 2.2 bgsave
  • 3. 触发快照时机
  • 4. rdb 文件产生过程
  • 5. rdb 文件恢复
  • 6. RDB 与 AOF 混用
  • 7. AOF 与 RDB 对比

1. RDB的持久化

  上一篇文章我们细讲了AOF日志进行Redis的持久化,今天我们讲另外一种方式——RDB快照持久化,其全程为 Redis Backup file(Redis数据备份文件)。

  快照这个东西,就是记录一瞬间,比如大家出去景区旅游就经常遇到一些帮忙拍快照的小贩。如果大家经常用虚拟机的话也应该知道,它里面就可以通过快照存储,当虚拟机崩的时候回到快照时的存储状态。而RDB也是同理,它可以记录一瞬间的Redis内存数据,记录的是实际的内存数据而非执行命令的日志,当需要恢复数据时,直接把dump.rdb文件读入内存即可,所以RDB的恢复效率要比AOF快得多,它不需要去执行操作指令来恢复数据。

【Redis从入门到进阶】第 9 讲:Redis 持久化之 —— RDB_nosql

2. RDB 的使用

  我们来学习一下RDB究竟应该如何使用,Redis提供了两个指令来主动生成RDB文件,分别是savebgsave。它们主要的区别在于是否由主线程来执行生成RDB文件操作:

2.1 save命令

  • save命令会直接在主线程生成RDB文件,如果写入RDB的时间太长,就会阻塞主线程。 此时其他客户端的请求就会被阻塞, 在生产环境下,一定要慎用该操作!

2.2 bgsave

  • bgsave命令会fork一个子进程来生成RDB文件,这样主线程可以继续执行其他客户端到来的命令。当子进程任务完成后,它会退出。
  • 【Redis从入门到进阶】第 9 讲:Redis 持久化之 —— RDB_redis_02

Redisconfig文件中我们也可以更改bgsave命令的配置信息:

save 900 1
save 300 10
save 60 10000
下面表示禁用RDB
save ""

前面的指令表示,900秒内至少用一个key被修改,则执行bgsave,第二个是300秒内至少10次修改则触发,第三条类似。注意虽然指令是写的save,但其实执行的是bgsave
当然还有一些其他的配置也可以修改

是否压缩,建议不开启,压缩会更消耗CPU,磁盘不值钱
rdbcompression yes
RDB文件名称
dbfilename dump.rdb

  RDB的快照方式是全量快照, 会将「所有数据」都记录到磁盘中,显然这个操作是一个重量级的操作,是非常消耗资源。如果太频繁的进行快照,会对Redis的性能造成极大影响,如果快照的间隔时间太长,一旦服务器宕机丢失的数据又会丢失大量的数据。所以设置多长时间进行一次bgsave,需要我们根据应用的场景来自己平衡。
  一般来说,bgsave是不会阻塞主线程的,但其实fork得到子进程这个操作是会阻塞主线程的(只不过这个操作很快),如果存在意外导致fork执行太久,此时也是有可能阻塞主线程的。

3. 触发快照时机

  除了上述我们讲的save命令和bgsave命令,还有一些情况Redis也会自动触发快照

    1. 主从复制时,从库全量复制同步主库数据,主库会执行bgsave
    1. 执行flushall命令清空服务器数据,生产环境慎用
    1. 执行shutdown命令关闭Redis时,会执行save
4. rdb 文件产生过程

   无论是哪种方式进行快照,rdb文件产生的过程如下:

    1. 生成临时 rdb 文件,并写入数据
    1. 完成数据写入后,让临时文件覆盖原rdb文件
    1. 删除原有rdb文件
5. rdb 文件恢复

  当Redis服务器重新启动时,如果根目录存在文件 dump.rdb,则Redis会自动去加载恢复数据。如果没有dump.rdb,我们需要手动将文件移动根目录下,是否成功加载RDB文件我们在启动日志在查看。

PS:在Redis加载 RDB文件时,主线程处于阻塞状态

6. RDB 与 AOF 混用

  不难发现,虽然RDB恢复数据比AOF快很多,但其快照的频率很难把握。

  • 频率太低,一旦宕机丢失的数据过多
  • 平吕太高,频繁写磁盘和创建子进程开销很大影响性能

  在我们的Redis 4.0 后,提供了AOFRDB的混用机制,也叫混合持久化。
开启混合持久化需要在config文化中手动开启

改为 yes 开启混合持久化
aof-use-rdb-preamble yes

  这样有什么好处呢?我们要知道,在子线程进行 bgsave时,主线程仍然会执行其他客户端发来的命令,这时子线程快照存储的是原本的内存数据,所以就会导致数据不一致,想修改只能等下一次bgsave的到来。

  当开启混合持久化后,在AOF重写日志时,fork的子进程会先以RDB的方式写入到AOF文件中,在子进程工程时,主线程处理的命令会存储到重写缓冲区内,当子进程完成RDB方式读入后,会再以AOF方式把重写缓冲区的指令写入到AOF文件中。

  这样操作后,AOF文件前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的 增量数据。

  这样我们可以集成两者的优点,前半部分由于是RDB所以加载很快,后半部分由于是AOF,所以丢失的数据更少。

【Redis从入门到进阶】第 9 讲:Redis 持久化之 —— RDB_缓存_03

7. AOF 与 RDB 对比

RDB

AOF

持久化方式

定时对整个内存做快照

记录每一次执行的命令

数据完整性

不完整,两次快照之间会丢失数据

相对完整,取决于刷盘策略

文件大小

会有压缩,文件体积小

记录命令,文件体积大

宕机恢复速度

很快


数据恢复优先级

低,因为数据完整性不如AOF

高,数据完整性高

系统资源占用

高,大量CPU和内存消耗

低,主要是磁盘IO,但重写时占用CPU和大量资源

使用场景

可以容忍数分钟数据丢失,追求更快的启动速度

对数据安全性要求较高





好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695