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