redis持久化(万一redis突然宕机了咋办?数据会丢失吗?)
回答标题问题:不会丢失。
先来说说什么是数据持久化,为啥要进行数据持久化。
第一点:什么是数据持久化。
在缓存服务中,我们都了解,他说一种高速缓冲,存放于内存的一种服务。那么内存中的东西生命周期是什么呢?通常来说,当机器关闭的时候,内存中的数据都会清空,都不会存储,那么下次开机的时候,不会出现之前的数据。那么为了防止这种情况突然发生,,我们通常都会对缓存做持久化操作。这里以redis为例
Redis提供了2中不同形式的持久化类型:
1.rdb(redis database)
原理:将redis在内存的数据库中的数据定时dump到硬盘上,实现rdb持久化。
在rdb持久化过程中,是在规定的时间间隔之内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入到临时文件中,写入成功后,再替换之前的文件,再用二进制压缩存储。那么此操作是一种间隔存储的,类似一种快照形式。
在整个的持久化过程中,主进程是不会进行任何的IO操作的,这就确保了极高的性能,如果我们需要大规模的数据的恢复,且对于数据恢复的完整性不是非常敏感,那么rdb方式要比aof方式更加高效。但是rdb的缺点就是最后一次的持久化操作很有可能丢失,那么一发生丢失就是整个数据丢失,下次备份还是需要重头开始。
那么从上面我们就可以总结出rdb的一个优缺点了:
优点:相较aof而言:rdb是比较磁盘空间的,他只是保持更新整个redis缓存中所有的数据的一个完整性。即,相当于在一定时间间隔内对redis缓存数据的一个持久化,采取一种临时文件替换上一层保存的文件,比较节省空间的。
然后,rdb是针对数据的角度进行一个持久化的,那么当然我们进行反向导入的时候,这个时候,rdb是高效的。但是弊端也相对明显,就是在每次fork redis中全数据的时候,会因数据量的增加而增加性能的消耗。
周期进行备份,但是如果突然停止,会丢失最后一次快照的修改。临时文件会丢失。
2.aof(append of file)
原理:将redis的操作日志以追加的形式写入到文件中。
通过只增不改,不删方式。Aof持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,文本的形式记录,可以打开文件看到详细的操作记录。
那么此种操作就一种日志形式来进行一个记录各种更新操作。会对每一次操作的命令进行一个记录,那么在redis服务进行一个启动的时候,会读取日志中的命令,对redis中的数据进行一个恢复。
所以可以看出aof是一个粒度比较小的操作。精确到每一条操作。且每条操作的前后都不影响。
那么这个时候也可以对比出aof的一个优点所在了:
备份机制更加成熟稳健,对每一条操作都会有所记录,那么就会大大的降低丢失率。
这是个日志形式的备份,那么我们就可以直接读持久化文件。可以对其人为的操作。
但是就是因为他的粒度细致,并且只会增加数据,不会修改数据,那么这个时候会占用更多的磁盘空间。且正因为日志,那么恢复的时候,也要从日志中读取出数据信息,进行一个反操作。那么粒度细,也会造成一定的性能压力,每次变更都会新增日志记录。官方也做出了一些声明:存在个别bug,会造成不能恢复现象。