从零学习redis(2)--- RDB持久化
redis 刘宇帅 6年前 阅读量: 1850
RDB 是 Redis 的一个持久化方案,也是 Redis 默认的持久化方案。RDB 持久化可以手动执行也可以根据服务器配置定期执行。
RDB 持久化所生成的 RDB 文件是一个经过压缩的二进制文件,使用该文件可以还原生成 RDB 文件时的数据库状态。RDB 保存在硬盘上,所以即使 Redis 服务器退出甚至运行 Redis 的服务器停机,但只要 RDB 文件还在就不影响数据的恢复。
RDB文件创建和载入
有两个 Redis 命令可以用于生成 RDB 文件,一个是 SAVE ,另一个是BGSAVE。
SAVE命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在这期间服务器不能接受任何命令请求。
127.0.0.1:6379> save
OK
和SAVE命令阻塞服务器进程做法不同,BGSAVE命令会派生出一个子进程(RDB的定期持久化也是fork一个子进程进行的),然后由子进程负责创建 RDB 文件,服务器进程可以正常处理命令请求。
127.0.0.1:6379> bgsave
Background saving started
和SAVE命令或则BGSAVE命令创建 RDB 文件不同,RDB 文件的载入工作是在 Redis 服务器启动的时候自动执行的,服务器启动时如果检查到 RDB 文件就会自动执行。
RDB 文件的默认目录是当前目录,文件名是 dump.rdb,可以在 redis.conf 配置文件里查看或则修改
dir ./ # rdb文件存储路径
dbfilename dump.rdb # rdb文件名
ps:AOF 文件的更新频率比较高,那么服务器会优先使用 AOF 文件恢复数据,如果服务器关闭了 AOF 功能的话才会使用 RDB 来恢复数据。
save bgsave 命令测试
我们起一个新的redis,这个时候 redis 里数据为空:
127.0.0.1:6379> KEYS *
(empty list or set)
这个时候我们在 redis 里新建几个值,并使用 save 或则 bgsave 生成 RDB 文件。
127.0.0.1:6379> set user:1 shuai
OK
127.0.0.1:6379> set user:2 bushuai
OK
127.0.0.1:6379> set user:3 shuaishuai
OK
127.0.0.1:6379> keys *
1) "user:2"
2) "user:3"
3) "user:1"
127.0.0.1:6379> save
OK
我们关闭 redis 服务器并再次启动
> $ docker stop 196cbe3bf787 // 我这里使用的docker
> $ docker start 196cbe3bf787
检查 redis 服务器里的数据
127.0.0.1:6379> keys *
1) "user:2"
2) "user:1"
3) "user:3"
127.0.0.1:6379> get user:1
"shuai"
127.0.0.1:6379> get user:2
"bushuai"
127.0.0.1:6379> get user:3
"shuaishuai"
查看 RDB 文件
REDIS0008� redis-ver4.0.11�
redis-bits�@�ctime����[used-mem��T
�
aof-preamble���user:2bushuaiuser:3
因为 RDB 文件是压缩的二进制文件,所以我们勉强可以看到我们数据的影子。我们可以通过设置配置文件 redis.conf 的 rdbcompression no 来关闭压缩。
我们关闭压缩,重启redis,并生成 RDB 文件
REDIS0008� redis-ver4.0.11�
redis-bits�@�ctime�a��[used-mem¨�
�
aof-preamble���user:3
shuaishuaiuser:2bushuaiuser:1shuai���Ga}y�
RDB文件压缩不压缩对比
压缩:
优点:减少磁盘存储空间
缺点:消耗CPU资源
不压缩:
优点:不消耗CPU资源
缺点:占用磁盘空间多
自动间隔性保存
RDB 是 Redis 默认的持久化方案,并且默认的持久化策略是周期性的,redis.conf 里相应配置如下
save 900 1 # 15分钟内至少有一个键被更改
save 300 10 # 5分钟内至少有10个键被更改
save 60 10000 # 1分钟内至少有10000个键更改
当满足上面任何一个条件的时候都会生成相应的RDB文件。如果要关闭 RDB 只需要把上面配置修改为
save ""
即使我们修改了配置以关闭 RDB,但是如果我们执行 SAVE 或则 BGSAVE 依然会生成 RDB 文件。
ps: RDB 文件会保存在 redis.conf 指定的文件里,所以 RDB 里保存的永远是上次生成 RDB 的时候的数据状态,如果我们需要定时备份不同时期的数据需要自己定时去备份不同时刻的 RDB 文件。