RDB 持久化 (Redis DataBase)
Redis 是内存数据库,如果不把内存中的数据库状态(所有非空数据库及其键值对)储存到硬盘中,当数据库进程退出,数据会消失。
RDB 文件的创建与载入
BGSAVE 使用 fork()
实现,fork()
会因为要为子进程产生一份虚拟空间表而花费较长的时间。如果此时客户端请求数量非常大的话,会导致较多的写时拷贝操作。而如果使用vfork()
实现,虽然不会产生虚拟空间表,但子进程和父进程共享地址空间,不能保证数据是同一时刻的。
BGSAVE 操作借用 copy on write 机制进行写时复制,父进程 fork 一个子进程,由子进程进行内存遍历将数据写入临时文件,父进程仍处理客户端请求,待子进程执行完毕,用临时文件替换之前的备份文件.RDB,因此无论RDB是否成功,dump.rdb 都是完整的。
BGSAVE 期间数据库发生的变化,不影响生成的RDB文件。
自动间隔性保存:BGSAVE
save 选项的默认条件:
save 900 1 // 如果900秒内,对数据库进行了至少1次修改,则进行BGSAVE
save 300 10 // 300秒内,对数据库进行了至少10次修改,则进行BGSAVE
save 60 10000
RDB 文件结构
db_version
长度为4字节,它的值是一个字符串表示的整数,记录了RDB文件的版本号。比如0006
代表文件的版本为第六版。
TYPE
表示value的类型。
EXPIRETIME_MS
长度1字节,表示要读入的是一个以毫秒为单位的过期时间。
ms
8字节长,是一个以毫秒为单位的UNIX时间戳,表示过期时间。
比如 value 为string类型,编码为 REDIS_ENCODING_RAW
,则存储结构: