Redis---持久化

一、aof(append only file)

概念

aof日志存储的是Redis服务器的顺序指令序列,aof日志只记录对内存修改的指令记录。按照redis的协议存储,例如:命令set key val 存为*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$3\r\nval\r\n

配置

配置如下:

##开启aof
appendonly yes
appendfilename "appendonly.aof"
	#刷盘策略 appendfsync always每条命令刷盘 everysec每秒刷盘 no交由系统刷盘 
appendfsync everysec 
	# yes如果aof数据不完整,尽量读取最多的格式正确的数据 
	# no如果aof数据不完整 报错, 可以通过redis-check-aof 来修复aof文件
aof-load-truncated yes 

##关闭aof复写
	#auto-aof-rewrite-percentage 为0 则关闭aof复写 64k 复写一次 128k 复写第二次
	#策略1 redis会记录上次aof复写时的size,如果之后累计超过了原来的size,则会发生aof复写
auto-aof-rewrite-percentage 0
	#策略2 为了避免策略1中,小数据量时产生多次发生aof复写,策略2在满足策略1的前提下需要超过64mb才会发生aof复写
auto-aof-rewrite-min-size 64mb
##关闭混合持久化
aof-use-rdb-preamble no
##关闭rdb
save ""

恢复

通过重放aof日志中指令序列来恢复Redis当前实例的内存数据结构的状态

缺点

1.随着时间越长,aof日志量越来越大
2.如果redis重启,重放整个aof日志会非常耗时,导致redis长时间无法对外提供服务

二、aof rewrite(aof复写)

概念

  • aof rewrite在aof的基础上,满足一定策略则fork进程,根据当前内存状态,转换成一系列的redis命令, 序列化成一个新的aof日志文件中,序列化完毕后再将操作期间发送的增量aof日志追加到新的aof日志中,追加完毕后替换旧的aof日志文件,以此达到对aof日志瘦身的目的。
  • 命令:BGREWRITEAOF

配置

# 开启aof
appendonly yes
appendfilename "appendonly.aof"
#appendfsync always每条命令刷盘 everysec每秒刷盘 no交由系统刷盘 
appendfsync everysec
#开启aof复写
#auto-aof-rewrite-percentage 为0 则关闭aof复写 64k 复写一次 128k 复写第二次
#策略1 redis会记录上次aof复写时的size,如果之后累计超过了原来的size,则会发生aof复写
auto-aof-rewrite-percentage 100
#策略2 为了避免策略1中,小数据量时产生多次发生aof复写,策略2在满足策略1的前提下需要超过64mb才会发生aof复写
auto-aof-rewrite-min-size 64mb
#yes 重启时如果aof数据不完整,尽量读取最多的格式正确的数据
#no 重启时如果aof数据不完整 报错, 可以通过redis-check-aof 来修复aof文件
aof-load-truncated yes

#关闭混合持久化
aof-use-rdb-preamble no
#关闭rdb
save ""

流程图

在这里插入图片描述

恢复&缺点

与aof一致

三.rdb

概念

  • 是一种快照持久化,它通过fork主进程,在子进程中将内存当中的数据键值对按照存储方式持久化到rdb文件中;rdb存储的是经过压缩的二进制数据;
  • 命令:BGSAVE

配置

# 关闭aof
appendonly no
# 关闭aof复写
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 64mb
# 关闭混合持久化
aof-use-rdb-preamble no
#开启rdb
#注释掉save以后为开启rdb模式 默认模式为下面3种
#save ""
#写了多个save策略,只需要满足一个则开启rdb持久化
#save 3600 1 #3600s内有一次修改
#save 300 100 #300s内有100次修改
#save 60 10000 #60s内有10000次修改

流程图

在这里插入图片描述

缺点

一旦redis宕机,redis将丢失一段时间的数据;RDB需要经常fork子进程来保存数据集到硬盘,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求,如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。

四、混合持久化

概念

混合持久化是吸取rdb和aof两者优点的一种持久化方案;aofrewrite的时候实际持久化的内容是rdb,等持久化后,持久化期间修改的数据以aof的形式附加到文件的尾部,实际上是对aof rewrite的优化。

配置

# 开启aof
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
#开启混合持久化
aof-use-rdb-preamble yes
# 开启rdb
save ""

流程

在这里插入图片描述

五、总结

  • mysql缓存方案中,redis不开启持久化,redis只存储热点数据,数据的依据来源于mysql;若某些数据经常访问需要开启持久化,此时可以选择rdb持久化,此时可以选择rdb持久化方案,也就是允许丢失一段时间数据;
  • 对数据可靠性要求高,在机器性能,内存也安全(fork写时复制 最差的情况下)的情况下,可以让redis同时开启aof和rdb,注意此时不是混合持久化;redis重启优先从aof加载数据(停服时使用shutdown save安全关闭,将内存重新生成一遍rdb,如果shutdown失败则使用aof重启redis),理论上aof包含更多最新数据;如果只开启一种,那么使用混合持久化;
  • 在允许丢失的情况下,可以采用采用主redis不持久化(内存就可以全部使用),从redis进行持久化(从数据库可以选择其他不需要fork进程的类型,防止内存过大)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值