RDB = Redis DataBase
RDB是什么:
在指定的时间间隔内将内存中的数据集快照写入磁盘
也就是行话讲得Snapshot快照,它回复时是将快照文件直接读到内存中
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,在用这个临时文件替换上次持久化好的文件.
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效.
RDB的缺点是最好一次持久化后的数据可能丢失
Fork
fork的作用是复制一个与当前进程一样的进程.新进程的所有数据(变量/环境变量/程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为元进程的子进程.
RDB保存的是dump.rdb文件
配置保存策略
save [seconds] [changes]
# 如果要禁用功能则使用:
save ""
上面的配置什么意思呢?
例如:
save 900 1
# 如果在900秒内有1次改动(增删改),则保存到硬盘中
save 300 10
# 如果在300秒内有10次改动(增删改),则保存到硬盘中
save 60 10000
# 如果在60秒内有10000次改动(增删改),则保存到硬盘中
多个策略可以并用,也就是说可以配置多个save...
手动执行保存到硬盘的操作
-
save
阻塞操作,其他操作不能执行
# 直接执行save命令
# 这是一个阻塞操作
save
# 就一个save,直接将内存中的数据保存到硬盘中
# 如果保存的一个数据非常重要,可以直接这么使用
-
bgsave
后台异步执行保存快照操作,同时还可以相应客户端请求
bgsave
-
lastsave
查看最后一次成功执行快照的时间
lastsave
# 返回是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
# 就是标准的Unix时间戳
- 指定存储至本地数据库时是否压缩数据,默认为yes, Redus采用LZF压缩,如果为了节省cpu时间,可以关闭该选项,但会导致数据库文件变得巨大
rdbcompression yes
# 还是压缩比较好
- 指定本地数据库文件名,默认值为dump.rdb
根据save的策略,redis的数据包保存在这个文件中
,在关闭数据库的时候也会强制保存一次
dbfilename dump.rdb
- 指定本地数据库存放目录
dir ./
# 上面这个./是个变动的值,程序在哪个路径敲命令启动的,那么就是在哪个路径
- 当写入数据到硬盘出错,则停止保存到硬盘
stop-writes-on-bgsave-error yes
- 存储快照后,进行数据校验
rdchecksum yes
# 在存储快照后,可以让redis使用CRC64算法来进行数据校验
# 但是会增加大约10%的性能消耗
# 我觉得10%不算什么
如何恢复硬盘中的数据到内存中?
- 直接将dump.rdb文件移动到redis安装目录,并启动redis即可
- //需要测试下,是不是移动到 dir的目录也行
RDB优势
- 适合大规模的数据恢复
RDB劣势
- 数据完整性和一致性不高
- 在备份的时候redis意外爆掉,可能会丢失最后一次快照后的修改
- fork的时候,内存中数据被克隆了一份,需要考虑内存的使用
- fork过程比较耗时,可能响应客户端的时间不能达到毫秒级
不怎么重要的内容
- 动态停止RDB保存规则
redis-cli config set save ""