Redis系列-06持久化

141 阅读2分钟

什么是持久化

Redis所有数据保存着内存中,一旦发生类似断电等意外情况,数据就会丢失,所以需要对数据的更新异步的保存到磁盘上。

image-20200605104551281

持久化方式

image-20200605104724641

RDB

什么是RDB

原理就是生成一份快照用于备份

image-20200605104948125

触发RDB的机制

save(同步)

save是一个同步的命令,在每秒访问量十万的系统中,执行save命令会导致其他客户端阻塞(等待一段时间)

image-20200605110448463

特点:

  • 文件策略:如果存在老的RDB文件,则替换
  • 时间复杂度: O(N)

bgsave(异步)

通过fork一个子进程来执行快照

image-20200605110833023

save vs bgsave

image-20200605111053811

自动生成RDB

image-20200605112704743

  • 900秒内有1条修改
  • 300秒内有10条修改
  • 60秒内有10000条修改

满足以上三条任意一条就会触发自动生成RDB

最佳配置

修改redis.conf中的默认配置

image-20200605113432680

修改点:

  1. 删除三个save配置,防止备份频率过高
  2. dump文件名中通过 port端口号来区分,在集群下方便查找
  3. 修改dump存放目录

容易或略的其他生成RDB的场景

  1. 全量复制
  2. debug reload
  3. shutdown

RDB总结

image-20200605114200923

AOF

RDB现存问题

耗时,耗性能

image-20200605115847140

不可控,丢失数据

image-20200605115950718

AOF运行原理

创建

客户端的所有操作都会追加到AOF文件中

image-20200605120109154

恢复

Redis重启后,将AOF文件重写到Redis中

image-20200605120216159

AOF策略

always

执行写命令时,先把命令写到缓冲区中,缓冲区会根据一些策略刷新到磁盘中

image-20200605120441637

everysec

every seconds, 每隔一秒将缓冲区的命令写到磁盘中

image-20200605120657056

no

由操作系统决定什么时候将缓冲区的命令写入磁盘,不需要我门操心

image-20200605120807454

三者比较

image-20200605120900226

AOF重写

把过期的,重复的,可以优化的命令进行化简,从而达到减少硬盘占用量并且加快数据恢复速度

image-20200605135347790

AOF重写的两种实现方式

  1. bgrewriteaof

    image-20200605135902030

  2. AOF重写配置

    image-20200605135946214

image-20200605140018020

AOF重写流程

image-20200605140619184

AOF配置

image-20200605140712682