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开始启用混合持久化和重放

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西门催学不吹雪ㅤ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值