6.Redis持久化

117 阅读4分钟

一、什么是持久化?

持久化:是将程序数据在持久状态和瞬时状态转换的机制。通俗的讲,就是将瞬时数据(比如内存中的数据,不能永久保存)转化为持久数据(比如转化为数据库或者磁盘文件中,能够长期保存)

JDBC就是一种持久化机制,文件IO也是一种持久化机制

二、为什么需要持久化?

redis数据存储在内存中,内存断电即失。所以我们需要将redis中的数据进行持久化,这样即使重启服务器,我们的数据依然存在

三、redis持久化策略

redis提供了两种持久化策略:RDB、AOF

四、RDB持久化

概念:RDB持久化是将当前进程中的数据按照一定规则生成快照保存到硬盘,保存的文件后缀是.rdb;当redis重启时,可读取快照文件进行数据恢复

五、RDB持久化

手动触发

save命令和bgsave命令都可以生成RDB文件

  • save命令生成RDB文件

    1、向redis中set k1 v1,重启redis,get k1看看能不能获取到

    Image.png

    Image.png

    结论:为进行持久化操作,重启redis后,数据丢失

    2、重新set k1 v1后调用save命令进行持久化操作,然后重启redis,再次get k1看看能不能取到

    Image.png

    结论:能够成功取到K1,redis中的数据被持久化到dump.rdb文件中,重启redis时,redis会读取rdb文件进行数据回复

    注意

    save:该命令会阻塞redis服务器进程,直到RDB文件创建完毕为止,在redis服务器阻塞期间,服务器不能处理任何命令请求
    bgsave:该命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,线上环境要杜绝使用save命令
    
  • bgsave命令生成RDB文件

    • 流程图 1174710-20180605085813461-389677620.png
    • 步骤
      • redis父进程首先判断当前是否在执行save或bgsave,如果有直接返回。

      • 父进程fork创建子进程,这个过程中发进程是阻塞的,redis不能执行来自客户端的任何命令

      • 父进程fork后,bgsave命令正确返回不在阻塞父进程,这是父进程可以响应其它命令

      • 子进程创建rdb文件,根据父进程内存快照生成临时快照,完成后对原有文件执行源自替换。

      • 子进程发送信号给父进程表示完成,父进程更新统计信息

自动触发

自动触发一般都是在redis.conf配置文件中进行配置

Image.png

命令解释:当900s期间内,如果检测到redis数据发生了至少1次变化,则执行bgsave命令生成rdb文件

  • 配置总结

参数解析:

save m n:bgsave自动触发的条件;如果没有save m n配置,相当于自动的RDB持久化关闭,不过此时仍可以通过其他方式触发
stop-writes-on-bgsave-error yes:当bgsave出现错误时,Redis是否停止执行写命令;设置为yes,则当硬盘出现问题时,可以及时发现,避免数据的大量丢失;设置为no,则Redis无视bgsave的错误继续执行写命令,当对Redis服务器的系统(尤其是硬盘)使用了监控时,该选项考虑设置为no
rdbcompression yes:是否开启RDB文件压缩
rdbchecksum yes:是否开启RDB文件的校验,在写入文件和读取文件时都起作用;关闭checksum在写入文件和启动文件时大约能带来10%的性能提升,但是数据损坏时无法发现
dbfilename dump.rdb:RDB文件名
dir ./:RDB文件和AOF文件所在目录

RDB和AOF对比

优势:

1.RDB是一个非常紧凑的文件,保存了redis在某个节点上的数据集,这种文件非常适用于进行备份和灾难恢复
2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作
3.RDB在恢复大数据集时的速度比AOF的恢复速度要快

劣势:

1.RDB方式数据没办法做到实时持久化,因为bgsave每次运行都要fork操作创建子进程,属于重量级操作,如果不采用压缩算法,频繁执行成本过高(影响性能)
2.RDB文件使用特定的二进制格式保存,redis版本演进过程中有多个格式的RDB版本,存在老版本redis服务无法兼容新版RDB格式的问题
3.在一定间隔时间做一次备份,所以如果redis意外宕机,就会丢失最后一次快照后的所有修改