Contents

数据库-redis-小林coding-持久化篇

本系列笔记为作者在跟随小林coding学习的时候做的笔记。感谢小林大大。

AOF 持久化

AOF(Append Only File):写命令执行完后将命令存储到硬盘中的日志文件

https://cdn.xiaolincoding.com//mysql/other/6f0ab40396b7fc2c15e6f4487d3a0ad7.png
AOF

默认是不开启,开启需要修改 redis.conf 配置文件

1
2
appendonly  yes
appendfilename  "appendonly.aof"

三种写回策略

redis.conf 配置文件中的 appendfsync 参数

https://cdn.xiaolincoding.com//mysql/other/98987d9417b2bab43087f45fc959d32a.png

AOF 重写机制

AOF 重写机制: AOF 文件的大小超过所设定的阈值后,将每一个当前存储的键值对用一条命令记录到「新的 AOF 文件」,并替换掉现有的 AOF 文件

AOF 后台重写

重写 AOF 过程是由后台子进程 bgrewriteaof 来完成的,好处:

  • 避免阻塞主进程;
  • 子进程带有主进程的数据副本(fork命令特性,另外还有仅复制页表的写时复制(Copy On Write))
https://cdn.xiaolincoding.com//mysql/other/5a1f2a90b5f3821c19bea3b7a5f27fa1.png

2个阻塞父进程的时机:

  • fork复制页表时
  • 子进程或父进程(主要)触发写时复制时拷贝物理内存

bgrewriteaof 子进程会设置AOF 重写缓冲区,存储重写AOF期间主进程执行的命令。主进程会同时将写命令存到 「AOF 缓冲区」和 「AOF 重写缓冲区」

AOF 重写期间,主进程需要执行:

  • 执行客户端发来的命令
  • 将执行后的写命令追加到 「AOF 缓冲区」
  • 将执行后的写命令追加到 「AOF 重写缓冲区」

子进程完成 AOF 重写工作后,向主进程发送一条异步信号。主进程收到信号后执行:

  • 将 AOF 重写缓冲区中的所有内容追加到新的 AOF 的文件中
  • 新的 AOF 的文件进行改名,覆盖现有的 AOF 文件

RDB 快照

记录某一个瞬间的内存数据,记录的是实际数据

  • AOF 文件的内容是操作命令
  • RDB 文件的内容是二进制数据

快照怎么用

save(阻塞主进程) 和 bgsave(不阻塞主进程) 生成 RDB 文件

900 秒之内,对数据库进行了至少 1 次修改

save 900 1

通常可能设置至少 5 分钟才保存一次快照

save执行过程中数据能被修改吗

写时复制技术(Copy-On-Write, COW),交给子进程来构建 RDB 文件,主线程还是可以继续工作

极端情况下,如果所有的共享内存都被修改,则此时的内存占用是原先的 2 倍可能会占满内存

RDB 和 AOF 合体

混合使用 AOF 日志和内存快照,也叫混合持久化

aof-use-rdb-preamble yes

大key

避免使用大key

  • 在复制页表时以及写时复制时降低AOF效率
  • 进而引发客户端超时阻塞
  • 引发网络阻塞
  • 阻塞工作线程(del)
  • 内存分布不均
 |