redis是内存数据库,他将自己的数据库状态存储在内存里面,异常退出数据就丢了,所以一定要持久化。这一节主要讲RDB持久化。
首先RDB就是一个文件。他记录了某一个时间点,redis所有数据的快照。
可以手动生成RDB文件,也可以让服务器定期生成RDB文件。
手动生成RDB文件
两个命令:
- SAVE
- BGSAVE
如果想尝试,直接在命令行敲这两个单词就可以了。
区别:
- SAVE是阻塞的,在生成RDB文件的时候,redis阻塞一切指令,相当于停止服务,知道RDB文件生成结束。
- BGSAVE是不阻塞的,执行BGSAVE的时候,会在主进程基础上fork一个子进程,当RDB文件生成结束后,通知主进程。注意:fork操作会在创建子进程期间阻塞主进程。
持久化存储,redis不可能让用户手动执行吧。两个命令只是给用户留的口,redis内部肯定有自动执行的策略。
自动保存RDB文件
可以通过配置文件来配置
// 900秒内,对数据库进行了至少1次修改
save 900 1
// 300秒内,对数据库进行了至少10次修改
save 300 10
// 60秒内,对数据库进行了至少1万次修改
save 60 10000
默认是这三个配置。
通过计数器,秒数,时间戳,循环判断这三个条件,满足其一,就执行一次RDB文件的创建。
当然了,还有两种必然会触发RDB持久化的场景
- 执行debug reload命令重新加载redis时,会触发save操作
- 执行shutdown命令时,如果没有开启AOF持久化,则自动执行BGAVE。
RDB文件是全量数据的快照。不是增量的。
redis通过RDB文件恢复数据
没有专门用来载入RDB文件的命令。只有在redis服务器启动的时候,检测到有RDB文件,就会自动执行RDB的载入。
但是redis会优先载入AOF文件。如果redis开启了AOF持久化,那直接执行载入AOF文件,RDB文件就废弃了。当redis没有开启AOF持久化功能的时候,服务器才会载入RDB文件。
RDB文件的结构
大写为常量,固定值。小写为变量。
RDB文件结构.png
- REDIS
就是字符串REDIS。一个固定值,表示开始。 - db_version
RDB文件的版本号。 - databases
数据库的所有库(0-15号)的所有key/value快照 - EOF
就是字符串EOF。一个固定值,表示结束。 - check_sum
校验和。是一个8字节的无符号整数。
databases部分
每个数据库的0-15号数据库,都是一个databases
0-15号数据库存储结构.png 每个号的数据库的存储结构.png key_value_pairs.png
TYPE是常量字符串,就是底层数据结构的type。
比如列表类型就是:REDIS_RDB_TYPE_LIST。
key就是数据库的key。
value根据类型,存储值。hash类型就是key/value挨着存。
先是0号数据库,0号数据库的所有key/value一个挨一个存好了。再1号数据库,1号数据库的所有key/value一个挨一个存好了。直到数据库存完了,后面紧挨着一个EOF + 校验和。
RDB 的优势和劣势
优势
-
RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
-
生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
-
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
劣势
RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。
网友评论