Redis的持久化
-
Redis的数据都是存储在内存之中的,为了数据的永久保存,需要吧数据同步到硬盘上,这个过程就叫做持久化,Redis的持久化存在有两种方式;rgb方式,aof方式,这两种方式可以单独使用,也可以综合使用。
-
rdb持久化方式:这种方式是redis默认开启的,是在指定的时间内触发指定的操作次数,便会将数据写入硬盘。
-
aof持久化方式:是以日志的形式,记录每一次的写操作,服务器启动后,根据日志来构建数据。
-
两种方式的优缺点,rdb性能高,但是由于机制问题,如果短时间内进行大量操作,引得redis崩溃,那么将会损失最后这段时间的所有数据,对数据的完整性没有保障;aof性能低,因为它是对于每一个写的操作都进行io流的读写操作,写在硬盘上,所以效率比较低,但以为精确到了每一次操作,所以对于数据的完整性有保障。各有所长,各有所短。
Redis持久化之rdb
-
RDB:在指定的时间间隔之内将内存中的数据集快照写入到磁盘,也就是行话所说的snapshot快照,他在恢复时试讲快照文件直接读取到内存中。
-
Redis是单线程,所以想要达到用户的主命令,与持久化同时运行,需在主进程之外,开一个fork子进程来确保两个操作同时进行,子进程会将数据写入到一个临时文件中,等持久化过程都结束之后,在将这个临时文件替换上次持久化好的文件,这样确保数据的安全性,不至于redis服务器宕机造成文件编写一半,就上次持久化的文件也给毁了。整个过程中,主进程不进行任何的io操作的,这样就确保了rdb方式的高性能,如果需要进行大规模的快照,且处于数据恢复的完成性不是很铭感,那么rdb方式将比aof更加适合高效。
-
rdb方式的优势:只有一个文件,时间间隔的数据,可以归档为一个文件,方便压缩和转移;
-
rdb方式的劣势:如果高并发造成宕机,那么这次高并发的数据将会丢失,因为是每隔一段时间进行持久化的操作。
-
rdb的配置
-
在redis目录下的redis.conf文件,因为rdb是默认开启的
图上是rdb的持久化策略
(1)save 900 1 表示每900秒至少有一个key发生变化,就持久化;
(2)save 300 10 同理没300秒至少有10个key发生变化,就持久化;
(3)save 60 10000 每60秒有10000以上的key发生变化, 就持久化;
图上是rdb持久化产生的文件名
图上是rdb文件的存储路径
- 备份数据:我们只需要把dump.rdb文件复制拷贝到另一个位置
- 还原数据:只需吧dump.rdb文件拷贝到你在配置文件中dir的路径上,重启redis就可以了。
Redis持久化之AOF
-
aof:以日志的形式来记录每个写操作,将redis执行过的所有写指令全部记录下来(不会记录读指令)只需追加文件,但是不可以改写文件,redis启动之初会读取该文件重新构建数据,即,redis重启的话就是根据日志文件的内容将写指令从头到尾的执行一遍,以完成数据恢复功能。
-
aof优势:安全性相对于rdb要高很多,记录了每一个操作也更能够追根溯源
-
劣势:因为进行了大量的io操作,效率比较低
-
Redis是默认关闭aof方式的
-
查看redis.conf配置文件
appendonly no表示aof方式默认为关闭,yes则为开启
appendfilename ‘“文件名” 就是aof存储的日志文件了
上图的配置是aof的三种同步策略:
always通过持久化,每次发生数据变更都会立即被记到磁盘 性能交叉但数据完成性比较好
everysec 异步操作,每秒操作,如果疫苗宕机,则会有数据丢失
no表示不同步
-
备份:跟rdb操作方式相同,将aof文件拷贝到其他存储设备之中
-
还原:同理将aof文件拷贝到 配置文件的设置目录下
-
如果在写入aof文件是服务器挂掉了,则aof文件中的内容肯定会存在错误指令,因为可能指令才写了一半就被强制停止了,这个时候需要将aof文件进行修复,在/usr/lical/bin目录下有个redis-check-aof可以用它来修复;
reids-check-aof --dix aof文件名
-
aof的重写机制原理:采用文件追加的方式,文件夹越来越大,我们需要避免这种情况,新增加了重写进制,当aof文件的大小超过设定的值,redis就是启动aof文件的内容压缩,只保留可以恢复数据的最小指令集。
-
aof文件持续的时间与文件的大小成正相关,在aof文件过大时,会fork出一条新的进程俩将文件重写(同rdb一样,先在临时文件中进入重写,待全部内容完成之后,在将临时文件的名字改成aof文件的名字进行覆盖),遍历新进程的内存中数据,并没有读取旧的文件,而是将整个内存中的数据内容用命令的方式重写进了一个新的aof文件,避免了重复操作,这样和快照有点类似。
-
触发条件
在APPEND ONLY MODE模块下有两条默认的配置:
这两条配置必须同事满足,才会触发aof的重写,第一条表示文件大小达到前一次保存文件的一倍,第二条表示aof文件的大小最小达到64mb。