Redis持久化机制详解

Redis持久化机制详解


  众所周知Redis的所有数据都放在内存里,如果突然宕机,数据就会全部消失,从而Redis提供了数据持久化来保证其可靠性。Redis持久化机制有两种,一是快照,二是AOF日志。

快照

  快照是某个时间点的一次全量数据备份,是二进制文件,在存储上非常紧凑。快照又分为手动触发和自动触。

手动触发

  Redis提供save和bgsave两个命令来手动触发快照备份。

  • save命令,会阻塞当前服务器直到快照完成为止,如果数据量大就会造成长时间无法处理客户端请求。
  • bgsave命令,Redis主进程会fork一个子进程来完成快照,完成后自定结束。Redis阻塞的时间就只有fork子进程的一瞬间,之后就能继续处理客户端请求。

自动触发

  • 配置redis.conf触发规则,自动执行。
  • 执行shutdown命令关闭服务器时,如果没有开启AOF持久化功能,那么会自动执行一次bgsave。
  • 主从同步(slave和master建立同步机制) 。

快照执行过程

  Redis使用操作系统的多进程 COW(Copy On Write)机制来实现快照持久化。
  首先,Redis在持久化时会调用glibc的函数fork产生一个子进程,快照持久化就会完全交给子进程来处理,父进程继续处理客户端请求。
  其次,子进程在持久化过程中不会修改现有的内存数据结构,只是对数据结构进行遍历读取,然后序列化写到磁盘中。
  然后,使用操作系统的COW机制进行数据段页面的分离,当父进程要对其中一页数据进行修改时,会复制一份数据以供其修改,子进程对应页面的数据不会变化。
  最后,子进程完成持久化后会发消息给主进程,通知持久化完成。
  因为子进程持久化对应数据没有变化,自始至终对应的都是某一时刻的数据,从而被称为快照。

AOF日志

  AOF日志AOF日志只记录对内存进行修改的顺序指令集。Redis收到客户端修改指令后,进行参数校验、逻辑处理后,就会将该指令存储到AOF日志中,即先执行指令后进行AOF日志存储。所以如果想要恢复内存数据结构,通过AOF日志顺序重放指令即可。
  Redis在长期运行的过程中,AOF日志会越来越长,重放整个AOF日志会非常耗时,所以就需要时常对AOF日志进行瘦身。

开启方式

  AOF默认是关闭的,可以通过redis.conf配置文件来开启。

## 此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
## 只有在“yes”下,aof重写/文件同步等特性才会生效  
appendonly yes  

## 指定aof文件名称  
appendfilename appendonly.aof

AOF重写

  AOF日志随着运行时间的增长其日志大小也会增加,可以使用bgrewriteaof命令来对AOF日志进行瘦身,其原理就是Redis会fork一个子进程来对内存进行遍历,并转换成一系列Redis操作指令,最后序列化到一个新的AOF日志中,再替换就AOF日志文件。

Redis 4.0混合持久化

  使用快照方式恢复数据,由于快照时间粒度较大回放时会丢失大量数据;使用AOF日志方式恢复数据,日志性能相对快照来说要慢,启动需要花费很长的时间。
  Redis 4.0为了解决这个问题,增加了混合持久化。所谓混合就是将快照文件的内容和AOF日志文件存在一起,这样一来AOF日志就不再是全量日志文件,而是自快照持久化开始到结束这段时间的AOF日志,这样一来就大大的减少了AOF日志文件。
  在Redis重启的时候,可以先加载快照文件的内容,然后再重放AOF日志文件,这样一来重启效率会得到大幅的提升。


一键三连,让我的信心像气球一样膨胀!

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redis持久是为了避免进程退出导致数据的永久丢失而设计的。由于Redis是基于内存的数据库,数据存储在内存中,关闭服务或者断电会导致数据丢失。为了解决这个问题,Redis提供了两种持久方式:AOF(Append Only File)和RDB(Redis Database File)。 AOF持久是通过将写操作追加到AOF文件中来实现的。AOF文件是一个只追加的日志文件,记录了写操作的命令。当Redis重启时,Redis会根据AOF文件中的命令重新执行一遍,从而恢复数据。AOF文件的大小会随着写操作的增加而增大,因此可能会占用较大的磁盘空间。为了避免AOF文件过大,Redis提供了AOF重写机制,可以定期地将AOF文件重写为紧凑格式,只保留可以恢复数据库状态的最小命令集合。 RDB持久是通过将当前数据库状态快照保存到一个二进制文件中来实现的。RDB文件是一个经过压缩的二进制文件,包含了数据库的数据和键值对的过期时间等信息。RDB持久是通过fork子进程来实现的,它会将当前数据库状态保存到一个临时文件中,然后替换原来的RDB文件。RDB持久适用于数据备份和灾难恢复。 除了持久之外,Redis还支持快照机制。快照是将当前数据库状态保存到一个RDB文件中,可以手动触发或者通过配置选项定期触发。快照只保存了数据库的最新状态,而不是增量的写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐只乐之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值