1. 概念
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时将快照文件直接读到内存中。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束后,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完成性不是很敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
2. 流程
3. 配置
redis.conf中的配置如下:
# 3600s内,至少有1个key进行了修改,进行持久化操作
save 3600 1
# 300s内,至少有100个key进行了修改,进行持久化操作
save 300 100
# 60s内,至少有10000个key进行了修改,进行持久化操作
save 60 10000
# 持久化出错 是否需要继续工作
stop-writes-on-bgsave-error yes
# 是否压缩rdb文件 会消耗一些cpu资源
rdbcompression yes
# 保存rdb文件时,是否校验rdb文件
rdbchecksum yes
# rdb文件保存的目录
dir ./
# rdb文件的名字
dbfilename dump.rdb
4. 测试
1)测试目标
# 3600s内,至少有1个key进行了修改,进行持久化操作
save 3600 1
2)删除rdb文件
[root@192 bin]# ls
cmake curve_keygen gdbserver redis-check-rdb redis-server
cpack dong_config redis-benchmark redis-cli
ctest dump.rdb redis-check-aof redis-sentinel
[root@192 bin]# rm dump.rdb
rm:是否删除普通文件 "dump.rdb"?r
[root@192 bin]#
3)设置key
[root@192 bin]# redis-server dong_config/redis.conf
[root@192 bin]# ps -ef | grep redis
root 4889 1 0 16:20 ? 00:00:00 redis-server 127.0.0.1:6379
root 5036 1772 0 16:23 pts/0 00:00:00 grep --color=auto redis
[root@192 bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set k1 5
OK
4)查看rdb文件是否生成
[root@192 bin]# ls
cmake curve_keygen gdbserver redis-check-rdb redis-server
cpack dong_config redis-benchmark redis-cli
ctest dump.rdb redis-check-aof redis-sentinel
[root@192 bin]#
生成了一个新的rdb文件。
5)退出redis并重启,查看k1值是否还存在
[root@192 bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set k1 5
OK
127.0.0.1:6379> SHUTDOWN
not connected> exit
[root@192 bin]# redis-server dong_config/redis.conf
[root@192 bin]# redis-cli -p 6379
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> get k1
"5"
127.0.0.1:6379>
可以看到k1的值为5,说明redis关机重启之后数据依然存在。
5. 触发机制
产生rdb文件的情况:
1) save规则满足;
2) 执行flushall命令;
3) 退出redis;
说明: 将rdb文件放在redis的启动目录时,redis启动时会自动检查dump.rdb文件,恢复其中的数据。