数据库-redis-小林coding-持久化篇
Contents
本系列笔记为作者在跟随小林coding学习的时候做的笔记。感谢小林大大。
AOF 持久化
AOF(Append Only File):写命令执行完后将命令存储到硬盘中的日志文件
默认是不开启,开启需要修改 redis.conf 配置文件
|
|
三种写回策略
redis.conf 配置文件中的 appendfsync 参数
AOF 重写机制
AOF 重写机制: AOF 文件的大小超过所设定的阈值后,将每一个当前存储的键值对用一条命令记录到「新的 AOF 文件」,并替换掉现有的 AOF 文件
AOF 后台重写
重写 AOF 过程是由后台子进程 bgrewriteaof 来完成的,好处:
- 避免阻塞主进程;
- 子进程带有主进程的数据副本(fork命令特性,另外还有仅复制页表的写时复制(Copy On Write))
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)
- 内存分布不均