今天我们说redis的持久化,redis有两种持久化方式。
RDB持久化
RDB 是Redis默认采用的持久化方式,RDB方式是通过快照完成的,当符合一定条件将自动将内部存的数据进行快照并持久化到磁盘。
RDB触发的方式如下几种
我们一一演示一下
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演示就到此结束,下次我们来看AOF持久化方式