redis持久化

redis持久化

        redis虽然是基于内存的数据库,但也是支持持久化的,主要是用于重启机器、机器故障之后恢复数据,或数据同步之类的需求.

        redis实现持久化主要有下面两种方式。

RDB

        快照方式,redis默认的持久化方式,redis生成快照文件来纪录在当前时间点,redis中的数据,redis发生重启之后可以使用RDB文件进行恢复,在redis。conf 配置文件中默认有此下配置

save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。

除了上述参数,在退出redis的时候会自动执行bgsave命令

redis提供了两种命令来生成RDB文件

save:同步保存操作,会阻塞 Redis 主线程;

bgsave:fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项,在fork的过程中如果有写命令进来,主进程会复制一份数据,进行写操作,原数据只读(copy on write)

bgsave执行流程

  1. 检查此时系统是否存在RBD/AOF的子进程正在执行,如果存在,返回错误。
  2. 执行fork操作,复制出子进程,在执行fork时主进程阻塞
  3. fork完毕,子进程执行生存RBD文件,主进程恢复工作,此时如果有写命令,采用写时复制的方法执行写命令(copy on write)
  4. 子进程执行完毕,通知父进程更新信息

RBD的缺点

1.两次执行之间有间隔,存在数据丢失风险

2.fork子进程,压缩,写出文件都比较耗时


AOF

AOF(append only file) ,每执行一条写命令,都追加记录到AOF缓冲区,然后再写到AOF文件中,最后再根据持久化方式刷新到磁盘中,只有同步到磁盘中才算持久化保存了,否则依然存在数据丢失的风险,比如说:系统内核缓存区的数据还未同步,磁盘机器就宕机了,那这部分数据就算丢失了。

AOF执行流程

  1. (append)所有命令追加到AOF缓冲区
  2. (write)将 AOF 缓冲区的数据写入到 AOF 文件中,用write函数将数据写入到了系统内核缓冲区之后直接返回了。
  3. (fsync)AOF 缓冲区根据对应的持久化方式,同步数据到硬盘,会阻塞到写入完成。
  4. (rewrite)如果AOF文件太大,需要定期对AOF文件重写
  5. (load)redis重启之后可以使用AOF文件进行恢复

AOF持久化方式

  1. appendfsync always:主线程用write函数将数据写入到了系统内核缓冲区之后,立即fsync同步到磁盘。性能消耗太大
  2. appendfsync everysec:主线程用write函数将数据写入到了系统内核缓冲区之后,每一秒执行一次fsync
  3. appendfsync no:主线程用write函数将数据写入到了系统内核缓冲区之后,不执行fsync,让系统自己决定什么时候进行fsync

一般采用appendfsync everysec方式进行同步,如果发生故障最多会丢失一秒的数据

AOF缺点

  1. 生成的文件大于RDB,过大时需要重写
  2. 恢复时没有使用RDB文件快
  3. AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值