Redis如何做持久化

为什么要做redis持久化

redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。

Redis如何做数据持久化

RDB(快照)持久化:保存某个时间点的全量数据快照

  • 找到redis.conf文件
  • 从文件中找到 save
  • sava 900 1 在900s以内有一条是写入指令,则触发备份,产生一次快照
  • save 300 10 在300s以内 如果有10 条写入,那么就会产生快照,如果变动数 > 0 还没有到10条则会等到90s以后才去做备份
  • 当进程操作出现问题的时候,则停止写入操作,这样是为了保护持久化数据一致性

redis数据持久化操作 redis怎么做数据持久化_redis数据持久化操作

  • 是将备份的文件压缩后再保存

备份文件 在src目录下,后缀名为.rdb

  • SAVE :阻塞Redis的服务器进程,直到RDB文件被创建完毕
  • BGSAVE:Fork出一个子进程来创建RDB文件,不阻塞服务器进程

自动化出发RDB持久化的方式

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

BGSAVE原理

redis数据持久化操作 redis怎么做数据持久化_持久化_02

fork:创建进程,实现了Copy-on-Write
Copy-on-Write : 如果有多个调用者同事要求相同资源,他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正的复制一份专用副本给该调用者,而其他调用者所见到的最初的资源任然不变

RDB持久化的缺点

  1. 内存数据的全量同步,数据量大会由于I/O而影响性能
  2. 可能会因为Redis挂掉而丢失从当前至最近一次快照期间的数据

AOF持久化:保存写状态

  • 记录下除了查询意外的所有变更数据库状态的指令
  • 以append的形式追加保存到AOF文件中

修改redis.conf文件

redis数据持久化操作 redis怎么做数据持久化_redis数据持久化操作_03

  • 设置为yes即可生效
  • redis数据持久化操作 redis怎么做数据持久化_持久化_04


  • appendfilename 生成的文件名
  • redis数据持久化操作 redis怎么做数据持久化_redis_05


  • 生成aof文件的额写入方式
    • always:及时将缓存中的内容写入文件
    • everysec:将缓存区中的内容每隔1s写入文件
    • no :交由文件系统决定

日志重写解决AOF文件大小不断增大的问题,原理如下:

  • 调用fork(),创建一个子进程
  • 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
  • 主进程持续将新的变动同事写到内存和原来的AOF里
  • 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
  • 使用新的AOF文件替换掉旧的AOF文件

Redis数据的恢复

redis数据持久化操作 redis怎么做数据持久化_数据_06


RDB和AOF的优缺点

  1. RDB:
    • 优点:全量数据快照,文件小,恢复块
    • 缺点:无法保存最近一次快照之后的数据
  2. AOF
    • 优点:可读性高,适合保存增量数据,数据不易丢失
    • 缺点:文件体积大,恢复时间长

RDB-AOF混合持久化方式

redis数据持久化操作 redis怎么做数据持久化_持久化_07

  • BGSAVE做镜像全量持久化,AOF做增量持久化