Redis持久化学习

Redis的持久化,是指将Redis内存中的数据写入磁盘,当服务故障或重启后,可将磁盘中的数据加载到内存中,以保证数据完整性。

持久化策略有两种

一:RDB

原理:Redis单独Fork一个子进程来进行持久化,这个子进程的所有数据(变量,环境变量,程序计数器等)都和原进程一样,会先将数据写入到一个临时文件中,持久化结束后再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的IO操作。

RDB默认开启,可通过config set save "" 或将save注释掉关闭,文件名通过dbfilename设置,默认是 dump.rdb,文件内容以二进制形式保存。

为什么会fork子进程?
因为6.0之前,Redis是单线程的,如果用主线程进行持久化,则会阻塞,导致持久化过程中服务不可用。

生成或加载文件位置:
dir   ./  (默认,与启动目录有关)
在不同的位置启动,有不同的数据空间,为了避免不同人员操作习惯不同,因此该路径需要固定

触发RDB条件
(1):shutdown时,如果没有开启AOF,则触发
(2):快照配置
指定在多长时间内有多少次更新操作,满足条件则将数据同步到数据文件,可多条件配合(定时任务)
save 900 1 (900秒有一个更改,做为备用)
save 300 100 (300秒有10更改,一般不用)
save 60 10000(60秒有10000更改,一般不用)


(3):手动执行save命令或者bgsave
save :主进程进行持久化,同步阻塞,慎用
bgsave: fork子进程进行持久化,异步非阻塞

bgsave执行流程
首先在父进程中查看有没有其他正在进行的子进程
如果有立即返回,如果没有,则父进程调用fork命令创建子进程,此时父进程阻塞
子进程创建完成后,父进程不再阻塞,子进程进行持久化,根据父进程内存生成临时快照文件,完成后对原有RDB文件进行原子替换
子进程执行完毕后,发送信号通知父进程,父进程更新统计信息
(4):flushall
因为flushall是清空内存中的数据,但不会操作磁盘。
若执行flushall时,未触发RDB,此时Redis故障。会出现内存中无磁盘中有情况,下次启动时又从磁盘加载数据。
为了保证清空内存时也清空磁盘数据,所以flushall需要触发RDB。


二:AOF
原理:将Redis的操作(读除外)日志以追加的方式写入文件(不会fork子进程)。

AOF功能默认不开启,可通过appendonly yes 开启,文件名通过appendfilename设置,默认为appendonly.aof,文件内容以文本文件形式保存,4.0版本后,如开启混合持久化机制,则重写后以二进制文件保存。

流程:主进程 ---- 缓冲区 ----(策略:定时任务)--- AOF持久化文件

所有写入命令都会追加到缓冲区
缓冲区根据配置策略向硬盘进行同步操作
根据配置策略对AOF文件重写

AOF触发策略
appendfsync,有三种值

(1)no 等缓冲区满了后,再一次性持久化到磁盘
(2)always 每次发生数据变更时,既缓冲区中只要一有数据,就立马持久化到磁盘
(3)everysec 每秒同步一次(默认值,但可能会丢失一秒以内的数据)


AOF重写

当Aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写(会fork子进程)。
重写是根据当前内存中的数据,生成新的快照文件,并不依赖于老的快照文件。

重写触发策略
当AOF文件大小增长率大于该配置项时自动开启重写
auto-afo-rewrite-percentage 100(100%)

当AOF文件代销大于该配置文项时开启自动重写,
默认64MB,尽量避免频繁触发重写机制,需要改大一点,一般5GB
auto-afo-rewrite-min-size 64MB

混合持久化机制(4.0版本之后的功能)
是否开启
aof-use-rdb-preamble yes
重写时,保存的内容格式用RDB保存,(重写后的为RDB方式,之后新增的为AOF方式)更节约空间资源,且恢复加载数据时效率提升

三:使用场景
一般情况两种持久化机制同时开启,优先使用AOF,RDB留作备用。
由于fork子进程属于重量级操作,频繁执行成本较高,因此尽量避免不要触发
持久化性能调优:
RDB配置save只保留触发频率低的,如900 1 
AOF重写策略文件大小调大。
开启混合持久化机制。

备注:B站学习笔记---1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值