Redis持久化

x33g5p2x  于2021-10-06 转载在 Redis  
字(2.5k)|赞(0)|评价(0)|浏览(286)

Redis的一个特色就是提供了持久化操作,也就是将内存中的数据保存到磁盘中。当重启机器或者转移机器的时候,可以快速的恢复数据。

Redis中提供了两种持久化策略:RDBAOF。我们接下来就详细的说一下这两种策略:

1、RDB

RDB使用的是快照的方式来备份redis,就是将redis中的所有数据生成快照 保存到磁盘上,是一个全量备份

RDB有3种备份模式:
1、save
由于redis服务器是单线程处理请求的,当客户端发起save命令后,redis服务器会进行数据的全量备份,当数据备份完毕后,才会处理其他客户端的请求。当子线程备份完成后,会将临时文件替换之前的旧RDB文件。

save模式会阻塞其他客户端的操作,不推荐使用。

2、bgsave
bgsavebackground save的简写,当客户端发起save命令的时候,redis服务器会fork一个子线程,子线程会将redis生成一个快照,然后将快照保存到一个临时RDB文件中。
在子线程执行备份操作的时候,主线程可以处理其他客户端的请求。
当子线程备份完成后,会将临时文件替换之前的旧RDB文件。

如果其他客户端这时发起了bgsave操作,redis服务器会查看是否有子线程正在执行备份,如果存在,就直接返回。

3、自动备份
以上两种模式都是手动备份模式,redis还支持自动备份模式。
通过在redis.conf配置文件中可以设置相关的备份信息。

set m n:对应的意思就是在 m 秒之内,如果有n个key发生变化,就自动触发备份。

自动备份采用的是bgsave,也就是异步备份。

RDB优点:
1、RDB中存储的是二进制数据,文件比较小,适合于定时备份。
2、RDB中直接存储的就是内存数据,在备份恢复的时候,速度更快。

RDB缺点:
1、如果两次bgsave之间发生故障,那么在此区间的数据就丢失了,所以RDB不适用于实时性要求高的备份。
2、不同版本的redis对应的RDB文件格式不同,可能会出现不兼容的情况。

2、AOF

AOF的全称是 Append-only File,也就是追加内容到文件,是一种基于日志的备份方式。

当redis发生写操作的时候,会将对应的操作语句追加到aof文件中。

aof中存放的是可读的文本数据。

AOF过程
1、AOF默认是关闭的,要在redis.conf中开启。

## 此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
appendonly yes  

## 指定aof文件名称  
appendfilename appendonly.aof  

## 刷盘策略,有三个合法值:always everysec no,默认为everysec  
appendfsync everysec

2、当客户端写入数据时,redis服务器会fork一个子线程,子线程会将对应的操作写入操作系统的文件系统缓存中。
但是可能不会立即写入到aof文件中,有以下三种模式可以选择:
1、always
每次写入的时候,都调用操作系统的刷盘函数fsync(),将数据写入到磁盘上。

性能最差,但是比较安全,不会丢失数据

2、everysec
redis每秒调用操作系统的刷盘函数fsync(),将数据写入到磁盘上。

性能还可以,当发生故障的时候,可能会损失1秒的数据。

3、no
每次只将数据写入到操作系统的缓存中,什么时候刷盘由操作系统决定。

性能最好,但是发生故障的时候,数据很有可能丢失。

这里额外提一下,无论是MySQL还是Redis都是基于操作系统开发的,底层都需要调用操作系统提供的函数接口来操作核心硬件和实现敏感操作。

AOF重写 rewrite
你可能会好奇,如果一个redis运行了好几个月的话,那么对应的aof文件不是太大了吗?

Redis提供了rewrite机制来重写aof文件,rewrite会遍历aof文件,将其中可以合并的记录进行合并,来减少aof中的操作记录,达到aof文件瘦身的目的。

当rewrite的时候,会将aof文件产生一个快照,然后进行一次扫描,然后将对应的合并结果保存到一个临时aof文件中,待扫描完成后,将临时aof文件替换为原本的旧aof文件。

如果在rewrite期间出现了新的aof记录,那么会将其加入到旧的aof文件中,然后在rewrite完成后,将新的aof记录追加到临时aof文件中。

rewrite原则:
1、已经过期的数据不再记录对应的aof
2、对于set操作,只保留最新的操作。
3、将多条可以合并的操作记录进行合并

我们举一个例子来看看rewrite的工作原理

incr k1 1
set k2 a
set k2 b
set k3 1
incr k1 2
incr k1 3
set k2 c
del k3
...
incr k1 100

如上面所示,连续对k1自增,连续设置k2的值,将k3创建后又删除了,连续记录了多条记录,浪费空间,可以将多条记录进行合并的。

incr k1 100
set k2 c

上面的多条记录可以用两条记录来进行替代,减少了很多空间占用。

rewrite的两种模式:
rewrite 分为 手动模式自动模式
1、手动模式:
当客户端调用bgrewriteaof的时候,会手动触发rewrite

2、自动模式
自动模式需要在redis.conf配置文件中设置对应的rewrite相关参数

## rewrite触发的aof最小文件大小
auto-aof-rewrite-min-size 64mb  

## 两次rewrite之间的触发条件,也就说当aof文件大小增长了百分之多少才会触发下一次的rewrite
auto-aof-rewrite-percentage 100

当第一次aof文件大于阈值的时候或者aof文件增长百分比超过规定的百分比的时候,会自动触发rewrite。

AOF优点:
1、AOF通过追加操作记录的方式来备份,能够实现实时备份。
2、AOF采用追加记录的方式备份,速度比较快

AOF缺点:
1、AOF采用追加记录的方式备份,日志文件比较大。
2、每次恢复的时候,AOF还需要重新执行来恢复,恢复速度比较慢。

3、混合持久化

将RDB和AOF混合起来做持久化,先利用RDB做全局备份,然后在利用AOF做增量备份。

RDB可以保证快的恢复速度,AOF可以保证数据的实时性。

相关文章

微信公众号

最新文章

更多