Redis持久化

redis支持数据持久化,两种方式:

  • 快照 RDB
  • 写日志 AOF

RDB

经过RDB之后,redis会将内存中的数据创建一份快照到硬盘中,称为RDB文件(二进制),当redis重新启动时,会加载硬盘中的RDB文件,加载到内存中完成数据恢复

RDB持久化数据的方式

1.save同步

  • 在save的同时,其它命令会阻塞,会阻塞主线程
  • 如果存在老的RDB文件,会先创建一个临时文件,然后对老文件进行替换

2.bgsave异步

  • 调用bgsave后,会调用linux的fork()函数,创建一个子进程
  • 如果存在老的RDB文件,会先创建一个临时文件,然后对老文件进行替换

自动触发达到如下条件触发

second (时间) changes (修改次数)
900 1
300 10
60 10000
RDB相关配置
  • dbfilename dump-${port}.rdb // 使用端口区分
  • dir /redis/data // 使用一个大的硬盘的目录
  • stop-writes-on-bgsave-error yes // bgsave发生错误停止写入
  • rdbcompression yes // 使用压缩的配置 主从复制拷贝快
  • rdbchecksum yes // 采用校验和的方式
额外触发生成rdb文件
  • 主从复制时机的全量复制,master节点会执行bgsave 生成rdb文件
  • debug reload // debug 级别的重启 不清空内存的方式重启
  • shutdown // 关闭时 shutdown save 会生成rdb文件
  • flushDB 、 flushAll

缺点:

  • 耗时
  • 耗性能
  • 不可控,容易丢失数据

AOF

通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中,实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中,当redis服务器启动时候,执行硬盘中的日志文件以恢复redis中的数据

AOF策略

1.always

注:执行每条写命令都将写命令写到磁盘中

  • 不丢失数据,IO开销较大

2.everysec

注:每秒将数据从缓冲区刷到磁盘中,可能会丢失一秒的数据

  • 每秒一次,保护硬盘,可能会丢失一秒的数据

3.no

注:写命令何时刷新的磁盘中,由操作系统来决定

  • 系统策略自动写入
AOF重写

1.重写的作用

  • 减少磁盘占用
  • 加速AOF恢复速度

2.重写实现方式

客户端发送一条bgrewriteaof命令后,redis会fork一个子进程完成AOF重写操作

AOF配置项:

  • auto-aof-rewrite-min-size 默认64MB AOF文件重写需要的尺寸,AOF多大时开启重写
  • auto-aof-rewrite-percentage 默认100 AOF文件增长率

同时满足触发重写

3.AOF重写原理

AOF重写不会读取老的AOF文件,而是根据当前服务器的状态生成一份新的AOF文件,将老的AOF文件进行替换

4.AOF相关配置

appendonly  yes  # 开启AOF
appendfilename aof-${节点名称}.aof # AOF文件名
appendfsync everysec # AOF策略 每秒写入
dir  /redis/data  # AOF文件所在目录
no-appendfsync-no-rewrite  yes  # 在执行重写时不进行AOF操作
auto-aof-rewrite-percentage  100  # AOF重写配置(见上文)
auto-aof-rewrite-min-size  64MB  # AOF重写配置(见上文)

RDB与AOF策略

关闭RDB自动执行配置 打开AOF(如果只是纯作为缓存使用可以不开AOF),对重写集中管理(预留30%的内存),使用每秒everysec

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