redis数据库的持久化

什么是持久化,就是把数据存储于断电后不会丢失的设备中,通常是硬盘

常见的持久化方式:

主从:通过从服务器保存和持久化,如mongodb的replication sets配置

日志:操作生成相关日志,并通过日志恢复数据

couchDB对于数据内容,不修改,只追加,则文件本身就是日志,不会丢失数据

redis的持久化方式一:

rdb快照持久化:每隔N分钟或者N次写操作后,从内存dump数据形成rdb文件,压缩放在备份目录,注意红色字体部分是可以通过参数配置的,导出的是内存的映像,所以恢复速度很快。

上述的持久化方式存在缺陷,如果在两个保存点之间断电,那么将会丢失至少1-N分钟的数据,所以出于对持久化的更精细要求,redis增添了aof方式(append only file)来保证redis持久化的进行

aof日志持久化:就是在数据库操作时,redis主进程负责响应,后台进程会将产生的命令保存进日志文件中,但是不是每产生一条命令就要保存进去,这样的话可能会大大降低数据的存储速度,折衷的方案可以设置每一秒保存一次日志,当然具体也是通过参数配置的,而且日志持久化和rdb持久化两种方式可以结合起来一起使用这样才能达到更好的效果,在rdb持久化进行时,aof日志写入可以暂停,日志数据存在队列中这样在rdb持久化进行完以后再从队列中将日志信息写入文件。

aof重写:在实际运用中可能会存在一下情形,即一个key的值经过了上百次的相同的操作之后变成了现在内存中的值,但是是不是aof就必须要把这所有的命令全都写进日志文件呢,事实上这种做法是不可取的,在aof写入日志文件的时候,会将内存中的key的具体状态逆化成一个命令的形式写入日志文件,而不会再去理会这个状态是经过多少次相同的操作得到的,这一操作叫做aof重写,经过aof重写以后日志文件就会大幅缩减,解决了日志过大的问题。那什么时候开始重写呢,这个在配置文件中可以通过参数来配置。(auto-aof-rewrite-percent 100    文件大小比起上次重写时的大小增长了100%   auto-aof-rewrite-min-size 64mb   aof文件至少超过64M时重写)

关于两种持久化可能存在的疑问:

1、在dump rdb的过程中 aof如果停止同步会不会丢失?

不会,因为所有的操作缓存在内存的队列里,dump完成后统一操作

2、如果rdb文件和aof文件同时存在,优先用谁来恢复数据?

aof,原因在rdb持久化中提及过,rdb持久化存在缺陷

3、恢复时,rdb和aof哪个恢复的快

rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要追条执行

猜你喜欢

转载自blog.csdn.net/weixin_42575020/article/details/113953510