redis是一个内存数据库,所有我们需要将他定时存在磁盘上,如果没有开启AOF,那么会生成RDB文件进行存储,其实就是个二进制文件
RBD文件通过SAVE BGSAVE进行创建,
SAVE会阻塞服务器进程,如果执行的话,那么client在这个期间发出的请求都不会响应
BGSAVE其实是创建fork出一个子进程来执行,其实本质他们都是在实行rdbsave
因为AOF的频率比RDB的频率高,所以启动服务器的时候,我们遵循着下面的原则
如果执行BGSAVE的时候,收到了save会被拒绝,因为他们都是执行rdbsave,两个进程同时进行的话会产生竞争
如果发出了BGREWRIEAOF的话,那么会等到BGSAVE执行完了在执行。相反的话会被拒绝,两个不可能同时进行,如果同时进行,会进行大量的写入磁盘操作
间隔性保存
struct redisserver{
saveparam
long long dirty
time_t lastsave
}
上述三个其实表示了执行BGSAVE的条件
saveparam就是指向的条件
eg:
save 300 1 300秒内执行一次
dirty表示上一次bgsave结束后执行了多少次操作
lastsave表示的上面bgsave的时间戳
通过计算并且循环判断就是可以确定是否需要执行BGSAVE
REDIS服务器会每隔100毫秒执行依稀,servercron函数,就是检查这个条件
RDB文件结构:
第一个大写的常亮,表示读的是RDBle,version是版本,EOF是数据库读完的结束标志,check_sum是一个效验码
中间的是各个数据库中的数据
上面表示的每一个数据库中的数据,主要是keyvaluepairs
上面就是两种带过期键和不带的两种结构
对于key其实就是一个字符串,对于value
(1)如果大于20字节,那么就会以压缩的方式存储,如果不是,那么会按原样存储
无压缩的结构和压缩的结构如下
对于其他的比如列表对象,集合,有序集合,哈希,都会在最前有一个总的长度,对于值,如果是字符串的话,还会在前面有一个length的记录