redis 数据持久化

1. RDB

全量

fork

redis.conf

//default configuration
save 900 1
save 300 10
save 60 10000

command

> SAVE
> BGSAVE 
  1. BGSAVE 命令
  2. rdbSaveBackground()
  3. redisFork()创建子进程
  4. fork()生成父子进程

fork()返回
返回0,当前是子进程。
返回-1,当前是父进程,子进程失败。
返回其他,当前是父进程。

fork()特性
子进程获得和父进程相同的内存空间(代码段、数据段)。
父子进程都会执行fork()后的代码。
创建子进程不会立刻大量内存拷贝。内存被修改时以页为单位拷贝,再次避免大量内存拷贝。(写时拷贝,copy on write)

copy on write

  • 解释

fork后,子进程地址空间指向父进程,父进程使用原来的物理内存空间。
子进程对内存空间有写入操作时,给子进程分配物理空间。

  • 原理
  1. fork()后,kernel设置父进程所有内存页权限设置为read-only,子进程地址空间指向父进程。
  2. 父子进程都读内存时,没有影响。
  3. 其中一个进程写内存时,CPU硬件检测到内存页是read-only,触发页异常中断(page-fault),陷入kernel中断例程。
  4. 中断例程中,kernel 把触发异常的页复制一份。

2. AOF:增量

增量

redis.conf

// default
appendonly no 
appendfilename "appendonly.aof"

# appendfsync always
appendfsync everysec
# appendfsync no

AOF重写

记录修改指令。
校验 > 存储 > 执行

  • AOF重写(瘦身)

BGREWRITEAOF指令
根据原来的AOF文件结果序列化新的AOF文件
对过程中新的指令追加到新AOF文件
替换旧AOF文件

fsync

强制把page-cache强制sync到磁盘。
进一步降低数据丢失情况。
阻塞,主进程负责。

3. 其他

redis-4.0开始启用混合持久化和重放

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容