Redis持久化

前情概要:

  和一个同事排查一个Redis的问题的时候,同事突然来了句“你知道Redis的几种持久化方式么?”,很自然的就答道“rdb和aof嘛“,同事则说其实有第三种方式“rdb和aof的混合版”,震惊!!!

 

Redis需要持久化的原因:

Redis数据都在内存中,当出现服务挂掉等场景时需要重新启动服务,若未进行持久化则直接数据丢失(其实就和最开始没用文件或者数据库学编程一样吧,重启下代码啥都得从头再来)

 

Redis持久化方式:RDB(快照)、AOF(追加)、混合(持久化操作数据rdb、之后操作aof)

 

RDB(快照)

  原理:将当前内存中的redis库中的数据写入磁盘(主进程会fork一个子进程执行BGSAVE命令来将内存中redis的数据写入临时持久化文件,同时主进程继续接收请求提供服务,待快照生成后使用临时文件替换原持久化文件)

  参数设置:配置文件中或者命令行修改参数,save seconds  updateCount(即在指定时间内执行了指定条修改操作将执行一次持久化),可设置多条

  优点:1、文件紧凑、小   2、性能较优    3、大数据集恢复比aof快  4、适用容灾(文件小传输快、恢复快)

  缺点:1、故障时会丢失最后一次持久化后的数据   2、大数据集时fork子进程较耗时  3、可读性差

  持久化命令:bgsave(fork子进程进行持久化)   save(直接阻塞进行持久化)

 

AOF(追加)

  原理:将所有修改指令追加到文件末尾(恢复时从头一条条执行命令即可)

  参数设置:appendonly设置为yes,appendfsync设置为everysec(每秒执行一次,默认)、always(每条修改命令都执行)、no(不主动执行,由操作系统决定)

  优点:1、故障时丢失数据少(取决于参数配置) 2、持久化文件兼容性(不受版本制约)、可读性强(协议较简单,了解规则可直接读懂,在未重写前可恢复至指定位置)

  缺点:1、持久化文件较大 2、性能可能没rdb快 3、可能重新载入时数据不一致

  持久化命令:bgrewriteaof

 

混合(RDB+AOF)

  原理:先将内存数据rdb快照存到aof文件前面,然后再将缓冲区数据通过aof格式存到aof文件末尾,然后替换旧文件

  参数设置:aof-use-rdb-preamble设置为yes

  优点:结合rdb和aof的优点,持久化文件小,加载快

  缺点:持久化文件可读性差、兼容性差(4.0前版本不识别)

  持久化命令:bgrewriteaof

  恢复:同aof,恢复aof文件,只是aof文件中可能前一部分为rdb格式

 

后话:各个方案都有自己的优劣,没有那种方案是万能最优解,我们需要根据实际的场景来选择持久化的方式,是啊,除了Redis的持久化我们的生活也如此,不是么?

 

posted @ 2020-12-20 23:06  霁源童  阅读(69)  评论(0编辑  收藏  举报