探索Redis持久化原理

RDB(默认)
RDB是通过快照方式完成的,当满足一定条件时,redis会自动将内存中的数据持久化到磁盘 。
触发快照的时机

  • 符合自定义配置的快照规则 。(在redis.conf中配置,下面会详细介绍)
  • 执行save或者bgsave命令
  • 执行flushall命令
  • 执行主从复制操作(第一次)
  • 在快照进行的过程中,也就是生成文件的过程中,不会对原有的rdb文件进行修改,直到快照生成完毕,直接将老的替换成新的,保证rdb文件任何时刻都是完整的 。
  • 我们可以通过定时备份rdb文件来实现redis数据的备份,rdb是压缩的二进制文件,占用空间小,有利于传输
###快照设置规则 save {多少秒内} {数据变化了多少}
例如:save 100 1:在100秒内,至少有一个键被修改就进行快照;save 200 4:在200秒内,至少4个键被修改就进行快照 。
RDB的优缺点
  • 缺点:使用RDB进行持久化,在redis突然异常退出的时候,会丢失最后一次快照之后的数据 。但是,可以根据组合设置自动快照的方式,降低数据损失,确保在接受范围内 。如果数据较为重要,可以使用AOF方式
  • 优点:使用RDB方式可以最大化redis性能,在快照过程中,我们可以看到主进程只需要fork出一个子进程即可,剩下的工作全部由子进程完成,父进程无需进行任何的磁盘I/O操作 。但是,如果数据集较大,在fork子进程的时候比较耗时,会导致redis在一段时间内停止处理请求 。
AOF方式默认情况下,redis是没有开启AOF(Append only file)的 。在开始AOF之后,redis每接收到一条更改redis数据的命令,就会将该命令写入硬盘中的AOF文件 。很明显,该过程会降低redis的性能,但大部分情况下是能够接受的,同时,使用性能较好的硬盘可以提高AOF性能
AOF配置方式
# 开启appendonly参数appendonly true# 设置AOF文件位置dir ./# 设置AOF文件名称,默认是appendonly.aofappendfilename appendonly.aof<br data-filtered="filtered">
RESP协议
Redis客户端使用RESP协议与Redis服务端进行通信,该协议是专门为redis设计的,但是也可以用于其他C-S项目 。
  • 间隔符号:在linux中是rn,在windows中是n
  • 简单字符串以'+'开头
  • 错误Errors,以'-'开头
  • 整数类型Integer,以':'开头
  • 大字符串以'$'开头
  • 数组类型Arrays,以'*'开头
AOF原理说明【探索Redis持久化原理】redis通过将所有的写入命令记录到AOF文件中,来持久化数据 。而将命令记录到AOF文件的过程,可以分成三个阶段:
  • 命令传播
  • 缓存追加
  • 文件写入和保存
命令传播redis将执行完的命令,命令参数,命令参数格个数等内容发送到AOF程序 。当redis客户端执行命令的时候,通过连接,将协议文本发送到redis,redis接收到协议文本之后,根据内容,选择适当的命令函数,将协议文本转换成Redis字符串对象,在命令函数执行完成后,将命令参数发送到AOF程序 。
缓存追加
AOF程序接收到命令参数之后,会将其从字符串对象转换成协议内容,再将协议内容追加到AOF缓存中 。AOF缓存是在redisServer结构的aof_buf中,新的内容会被追加到aof_buf末尾 。aof_buf保持着所有未被写入到AOF文件的协议文本 。
文件写入和保存
将AOF缓存内容写入到AOF文件,并保持到磁盘 。当服务器的常规函数被执行,或者事件处理器被执行的时候,flushAppendOnlyFile函数将会被执行 。会有以下两个过程 。
  • WRITE:将AOF缓存中的内容写入到AOF文件
  • SAVE:调用fsync或者fdatasync函数,将AOF文件保存到磁盘中
AOF一共有三种保存模式
  • AOF_FSYNC_NO:不保存 。在这种模式下,每次调用flushAppendOnlyFile函数,write会被执行,而save会被忽略 。而save只有在以下三种条件下会触发,redis关闭,aof功能关闭,系统的写缓存被刷新(可能是缓存满了,或者定期执行保持操作) 。这三种情况下执行save操作会引起redis主线程的阻塞 。
  • AOF_FSYNC_EVERYSEC(默认):每秒保存一次 。save每秒被执行一次,但是save由后台子线程完成,不会导致redis主线程阻塞 。
  • AOF_FSYNC_ALWAYS:每执行一个命令保存一次 。这种情况下,每执行一个命令write和save都会被执行,而且save操作由主线程完成,会导致redis的阻塞 。安全性较高,性能较差,因此不推荐使用 。
AOF的文件优化Redis可以在AOF文件过大的时候,在后台(子进程)对AOF文件进行重写 。重写之后的新文件,包含恢复当前数据集所需的最小命令集合 。重写,并不会对AOF文件进行读取和写入,针对的是数据库中的当前键 。


推荐阅读