Redis持久化

白昼怎懂夜的黑 提交于 2020-02-03 02:34:04

RDB

redis默认持久化方式为RDB,即快照持久化
在redis.conf中,有触发备份的规则

save 900 1    在900秒内,如果有一次redis操作,就进行备份
save 300 10    在300秒内,如果有10次redis操作,就进行备份
save 60 10000 在60秒内,如果有10000次redis操作,就进行备份
#save ""    如果想禁用rdb,取消注释即可
stop-writes-on-bgsave-error yes    如果备份进程出错,主进程停止写入操作,保持数据一致性
rdbcompression yes 开启压缩配置rdb文件,建议关闭,因为压缩也会消耗cpu的性能,cpu比硬盘更值钱

备份会生成一个dump.rdb文件,此文件是二进制文件

创建RDB文件

在这里插入图片描述
save很少使用,因为save指令会在redis的主线程中进行备份,redis是用一个主线程来处理请求的,会阻塞client的请求

通过lastsave来获取上次save的时间
可以通过java计时器,调用bgsave指令,来生成备份文件,并添加时间戳存储,作为某个时间的全量数据脚本move dump.rdb dumo时间戳.rdb

自动触发RDB持久化

  • 根据redis.conf配置的save m n 定时触发(用的是BGSAVE)
  • 主从复制时,主节点自动触发
  • 执行Debug Reload
  • 执行shutdown且没有开启AOF持久化

BGSAVE原理
执行BGSAVE指令后,首先检查当前主进程有没有正在执行的RDB或AOF子进程,如果有,则返回错误,没有,则开始持久化,调用rdbSave
Background,调用linux的fork指令,创建进程,实现了Copy-On-Write。
传统方式的fork,会将主进程的所有资源复制给子进程,这种方式实现简单,但是效率低下,而且复制的资源可能对子进程毫无用处。
linux为了降低创建子进程的成本,当父进程创建子进程时,内核只为子进程创建虚拟空间,父子两个进程使用相同的物理空间,只有父进程发生更改时,才为子进程创建独立的物理空间
在这里插入图片描述
RDB持久化的缺点
在这里插入图片描述

AOF

开启aof需要在reids.conf中将appendonly 设置为yes。

appendfsync  everysec  设置aof文件写入方式,还能接收always 和no 作为参数

always是,一旦缓存内容发生方便,就将缓存的内容写入到aof中
everysec是每隔一秒将缓存的文件写入到aof文件中
no是将写入aof文件的操作交给系统来决定,一般操作系统会在缓存区被填满再执行备份操作
推荐使用everysec方式,速度快,安全性也不错

aof持久化是一个追加操作,就会出现aof文件不断增大的问题。
如果将一个计数器递增100次,只需要保留结果为100即可,但是aof会保存100次操作记录,但是redis有解决方案,在不中断服务的情况下,在后台重建aof文件,即通过日志重写来解决
日志重写原理
在这里插入图片描述

RDB和AOF文件共存情况下的数据恢复

先检查aof文件是否存在,如果存在就加载aof忽略rdb,如果不存在就尝试加载rdb文件

RDB和AOF的优缺点

在这里插入图片描述

RDB和AOF混合持久化

redis4.0后,使用混合持久化作为默认的备份方式
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!