Redis高级应用--数据持久化

一、Redis数据持久化

Redis数据保存在内存中,服务器由于一些原因断电后会丢失数据,因此需要将数据保存在硬盘上,防止服务器断电后数据丢失。将数据保存在硬盘上的过程就叫做数据持久化。持久化方式可分为两种:

  • 将数据当前的状态进行保存,通过快照的方式,只保存数据;
  • 将数据操作的过程进行保存,只保存数据的操作过程;

reids支持两种持久化操作,一种是RDB方式,一种是AOF操作方式。RDB方式会根据制定规则“定时”将数据保存在硬盘上。而AOF方式会在每次执行命令后将命令本身记录下来。

二、RDB方式

RDB文件的创建

RDB方式当符合条件时,redis会将 所有数据生成副本保存在本地,这个过程成为快照。以下几种方式对数据进行快照:

  • 配置的规则
  • 执行save或者bgsave命令
  • 执行flushall命令
  • 执行复制

    1.配置

    在redis安装文件中,打开redis.conf文件
    1
    2
    3
    save 900 1
    save 300 10
    save 60 10000
    条件之间是“或”的关系。save 900 1 是指在15分钟(900秒)内有一个或者一个以上键被更改就进行快照。值得注意的是,这里使用的是BGSAVE命令而不是SAVE命令。
    Alt text

2.用户执行save 或bgsave命令

服务器进行重启或者是备份时,需要手动对redis进行快照。

  • 当执行save时,redis会执行快照操作,此时该过程会阻塞所有请求。
  • bgsave会异步的执行快照操作。,执行bgsave后会返回ok,然后通过lastsave来返回最近一次执行快照成功的时间。

    3.执行flushall命令

    当执行flushall命令,redis会清空数据库中所有数据。

    4.执行复制时

    当设置主从模式之后,redis会在复制开始之前进行自动快照。

    SAVE指令相关配置

    创建新的redis.conf文件,文件内容如下:
    1
    2
    3
    4
    5
    6
    7
    port 6379
    daemonize yes
    logfile "6379.log" #配置redis的log文件名称
    dir /data/redis/ #设置存储rdb文件的路径,应该存在存储空间较大的目录中
    dbfilename dump-6379.rdb #设置rdb文件的名称,通常为dump-端口号.rdb
    rdbcompression yes #设置rdb文件是否压缩,默认为yes,采用lzf压缩,如果设置为no,可以节省CPU运行时间,但是存储文件会变大。
    rdbchecksum yes #设置rdb文件是否进行格式校验,校验在读文件和写文件过程均进行。默认为开启状态,如果设置为no,可以节约10%时间,但是数据可能会损坏。
    并且使用一下命令启动redis,即可通过新的配置文件启动redis:
    1
    redis-server redis.conf 

RDB文件的载入

RDB文件的载入是在服务器启动时自动执行,Redis没有专门用于载入RDB文件的命令,如果服务器启动时检测到RDB文件的存在则自动载入RDB文件。如果开启AOF持久化,那么服务器会优先使用AOF文件载入数据库。另外服务器载入RDB文件期间,数据库会处于阻塞状态,拒绝所有命令请求,直到载入数据完成。

三、AOF方式

AOF设置

AOF(Append Only File)方式可以将redis的每一条命令追加到硬盘文件中。默认AOF是没有开启的。通过

1
appendonly yes 

开启AOF模式。

Alt text

但是由于操作系统原因,AOF模式保存的数据并没有保存到硬盘,而是保存在硬盘缓存。默认情况下是30秒执行一次同步。redis无法容忍这样的损失。这就要AOF模式将硬盘缓存中的数据立即同步到硬盘。在redis中可以通过appendfsync参数设置同步时机。

1
2
3
4
5
# appendfsync always  # 每次,数据零误差,性能较低,不建议使用
appendfsync everysec # 每秒,性能较高,建议使用
# appendfsync no # 系统控制,不可控
appendfilename appendonly-端口号.aof # 配置aof持久化文件名,默认为appendonly.aof,建议为appendonly-端口号.aof
dir /data # aof文件存储目录

同时开启AOF和RDB,保证数据安全和备份。当服务器redis开启后,会首先加载AOF中的数据。因为AOF方式丢失的数据更少。

AOF重写

命令不断写入AOF,文件会越来越大,因此Redis引入AOF重写机制压缩文件体积。AOF重写是将多条命令合并为一条命令,例如:

1
2
3
lpush list a
lpush list b
lpush list c

重写为:

1
lpush list a b c

值得注意的是,AOF重写不会对原来的文件进行读取、修改和分析,而是创建新的AOF文件,来替换旧AOF文件。AOF重写不是读取和分析旧AOF文件,而是直接去数据库读取list的值,然后用新的命令代替原来的命令。

手动重写

1
bgrewriteaof     # 执行指令重写aof文件

bgrewriteaof命令是调用fork函数,创建子进程去重写文件

自动重写

1
2
auto-aof-rewrite-min-size size  # AOF文件达到这个大小就重写
auto-aof-rewrite-percentage percentage # 达到这个比例就重写

自动重写出发条件:

1
2
3
4
aof_current_size > auto-aof-rewrite-min-size

(aof_current_size - aof_base_size) /
aof_base_size >= auto-aof-rewrite-percentage

其中aof_current_size和aof_base_size参数可以通过info指令查看当前redis的参数值。