一、背景

我们知道Redis是一种NoSql数据库,常用来做缓存数据库,因为运行在内存中,不用每次再到数据库中去查询需要的数据,所以比普通的关系型数据库性能更优越,在内存中操作数据肯定比磁盘上性能是很大的提高。所用很多企业都拿redis来做缓存数据库。在内存中存储数据就会涉及到一个不可避免的问题,如果宕机或者机器受到物理损坏或者关机的时候,内存中的数据就会消失。但是当我们再次开启redis服务的时候,数据还是存在的。既然是数据在内存中存储,我们再次开机时候,内存又加载了我们机器出问题时候的数据。redis具体是怎么做到的,这就是我们今天所要说的redis持久化机制。

二、原理

redis持久化实现有两个方式RDB(Redis DataBase 默认开启)和AOF(Append Only File 默认关闭)都是通过来保存文件在磁盘中,在redis服务在启动时,在将数据读取到内存中。所以我们在重启开启服务时候,发现之前的数据还存在。

三、实现机制

rdb方式是通过在是定时间内将内存中的数据集快照(Snapshot)写入磁盘;在数据恢复时,再将快照中的信息读取到内存中。

四、优缺点

优势:适合大规模的数据恢复,对数据的完整性和一致性要求不高; 劣势:在一定的时间间隔内做备份,会丢失一部分数据,因为一般会丢失最后一次的保存记录,可以通过lastsave获取最后一次快照的时间查看。

查看最后一次写入磁盘的时间的命令:

10.3.152.78:6379> LASTSAVE
(integer) 1563805120       #Unix时间戳

备注:当我们同时开启两钟持久化方式,redis重启时候会优先载入aof文件来恢复数据,因为在一般情况写aof存储的文件数据比rdb形式存储的文件更加的完整。

五、恢复模拟

1、分别把两台redis服务器的redis服务停止。 2、把需要还原的rdb文件,复制到另外一台服务器上,查看当前存放位置路径

10.3.152.78:6379> config get dir
1) "dir"
2) "/var/lib/redis"         #rdb文件存放路径,并保证没有aof文件存在,否则默认优先加载此文件
10.3.152.78:6379> 

3、设置相应的权限与修改相同的文件(保证与当前的rdb文件名和权限一致,覆盖) 4、启动redis服务 5、用info命令查看,当前的数据数量是否与相符