首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis持久化RDB详解

Redis持久化RDB详解

作者头像
小土豆Yuki
发布2020-06-15 17:35:59
3700
发布2020-06-15 17:35:59
举报
文章被收录于专栏:洁癖是一只狗洁癖是一只狗

今天我们说redis的持久化,redis有两种持久化方式。

  • RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
  • AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
  • 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
  • 你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
  • 最重要的事情是了解RDB和AOF持久化方式的不同,让我们以RDB持久化方式开始

RDB持久化

RDB 是Redis默认采用的持久化方式,RDB方式是通过快照完成的,当符合一定条件将自动将内部存的数据进行快照并持久化到磁盘。

RDB触发的方式如下几种

  1. save
  2. bgsave
  3. 符合配置文件快照规则
  4. 还有一些其他操作会触发快照如,shutdown,主从复制,flushall命令(不是本次的重点,不进行讲解)

我们一一演示一下

save操作

实际上在执行save操作的时候,其他客户端的操作会阻塞

我们实际操作一下

第一步 先查看dump.rdb大小

root@5a989f5f2782:/data# ls -lh
total 12K
-rw-r--r-- 1 redis root    0 Sep 16 14:20 appendonly.aof
-rw-r--r-- 1 redis root   93 Sep 16 14:20 dump.rdb  //大小是93
-rw-r--r-- 1 redis root 4.4K Sep 16 14:21 redis.log

第二步 操作数据

127.0.0.1:6379> set s1 v1
OK
127.0.0.1:6379> set  s2 v2
OK
127.0.0.1:6379> set s2 v2
OK
127.0.0.1:6379> save
OK

第三步查看操作完后 dump.rdb大小

root@5a989f5f2782:/data# ls -lh
total 16K
-rw-r--r-- 1 redis root  110 Sep 16 14:28 appendonly.aof
-rw-r--r-- 1 root  root  112 Sep 16 14:28 dump.rdb //大小112 说明有数据持久化到了rdb文件
-rw-r--r-- 1 redis root 4.4K Sep 16 14:28 redis.log

第四步查看dump.rdb里面的内容(存储的是二进制)

root@5a989f5f2782:/data# cat dump.rdb
REDIS0008�    redis-ver4.0.14�
redis-bits�@�ctime�!�]used-mem�(�
 aof-preamble���s1v1s2v2���3d���r  //我们查看看rdb文件大概能看到存储的数据

bgsave操作

1.redis使用fork函数复制一份当前进程的副本(子进程)

2.父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。

3.当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成

我们演示一下

第一步查看dump.rdb文件大小

root@5a989f5f2782:/data# ls -lh
total 16K
-rw-r--r-- 1 redis root  548 Sep 16 15:26 appendonly.aof
-rw-r--r-- 1 root  root  147 Sep 16 15:26 dump.rdb  //rdb文件大小 时间15:26
-rw-r--r-- 1 redis root 5.5K Sep 16 15:26 redis.log

第二步 执行bgsave

127.0.0.1:6379> set s3 v3
OK
127.0.0.1:6379> set v4 v4
OK
127.0.0.1:6379> set v5 v5
OK
127.0.0.1:6379> bgsave
Background saving started

第三步 查看rdb文件大小,是否替换

root@5a989f5f2782:/data# ls -lh
total 16K
-rw-r--r-- 1 redis root  635 Sep 16 15:27 appendonly.aof
-rw-r--r-- 1 root  root  161 Sep 16 15:27 dump.rdb //文件变大 时间也更新了
-rw-r--r-- 1 redis root 5.8K Sep 16 15:27 redis.log 

中间是应该生成临时文件,由于时间太短暂不好演示,大家自行领悟吧!

注意事项

1. redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。

2. 这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份, RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。

3.save操作是同步操作,bgsave是异步操作的(fork子进程是执行非常快的(大多数情况),但是极少数情况下fork执行慢的话依然会阻塞redis)。

配置文件触发快照,默认配置

save 900 1 表示15分钟(900秒钟)内至少1个键被更改则进行快照
save 300 10 表示5分钟(300秒)内至少10个键被更改则进行快照
save 60 10000 表示1分钟内至少10000个键被更改则进行快照

我们演示一下,为了演示方便我们修改如下

save 900 1
save 300 10
save 30 5

配置文件redis.conf里面的条件是或的关系。

如图所示的配置代表,如果30s改变了5次数据,300s改变了10次数据,900s内改变了一条数据,三个条件任意满足一条即会自动生成RDB文件,当然它的自动生成实际是执行了 bgsave命令。

第一步操作数据

127.0.0.1:6379> set s1 v1
OK
127.0.0.1:6379> set s2 s2
OK
127.0.0.1:6379> set s3 v3
OK
127.0.0.1:6379> set s4 v4
OK
127.0.0.1:6379> set s5 v5
OK
127.0.0.1:6379> set s6 v6
OK
127.0.0.1:6379> exit

第二步可以查看日志看是否进行快照操作(也发现实际上是使用bgsave)

1:M 16 Sep 15:46:59.316 * 5 changes in 30 seconds. Saving...
1:M 16 Sep 15:46:59.321 * Background saving started by pid 34  //也发现实际上是使用bgsave
34:C 16 Sep 15:46:59.325 * DB saved on disk

RDB的优缺点

优点

  • RDB是一个非常紧凑的文件,它保存了某个时间点的数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集.
  • RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复.
  • RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.
  • 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.

缺点

  • 如果你希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据.
  • RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度.

本次RDB演示就到此结束,下次我们来看AOF持久化方式

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档