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 ,则存储结构:


重点回顾


1746

被折叠的 条评论
为什么被折叠?



