redis持久化机制

1. 是什么

redis是基于内存的数据库,将内存中的数据写到磁盘中,就是持久化

为什么会存在持久化?

因为没有持久化的话redis重启或者断电之后数据就会丢失。

2. RDB

redis默认的持久化方式。

2.1 RDB持久化配置

#在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 900 1
save 300 10
save 60 10000
#指定持久化文件的保存目录
dir /soft/redis
#rdb持久化文件名
dbfilename dump.rdb

2.2 原理

redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,在fork子进程的过程中,主进程不进行任何的io操作,这个子进程的所有数据(变量。环境变量,程序程序计数器等)都和原进程一模一样,会先将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的io操作,这就确保了极高的性能。

2.3 触发rdb持久化机制

shutdown

关闭redis服务时

save

只管保存,其他不管,全部阻塞

bgsave

redis会在后台异步进行快照操作,同时可以响应客户端的请求

flushall

用于清空整个 Redis 服务器的数据

3. AOF

3.1 AOF持久化配置

#no:关闭aof持久化,yes:开启aof持久化
appendonly yes
#no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证)
#always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全)
#everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)
appendfsync everysec
#aof持久化文件名
appendfilename "appendonly.aof"

3.2 原理

将Reids的操作日志以追加的方式写入文件,读操作是不记录的。

3.3 触发AOF持久化机制

根据配置文件配置项appendfsync

3.4 AOF重写机制

为什么需要重写?

因存aof是将操作日志以追加的方式写入文件,那么持久化文件中就存在添加一个key之后又删除该key的无用操作,需要将这样的操作剔除掉,因此需要重写aof持久化文件。

当AOF文件增长到一定大小的时候Redis能够调用 bgrewriteaof对日志文件进行重写 。

当AOF文件大小大于该配置项时自动开启重写:

auto-aof-rewrite-min-size 64mb

当AOF文件大小的增长率大于该配置项时自动开启重写(这里指超过原大小的100%)。

auto-aof-rewrite-percentage 100

3.5 混合持久化机制

redis4.0后支持混合持久化,混合持久化是通过aof重写bgrewriteaof完成的。

#yes:开启混合持久化机制,no:关闭混合持久化机制
aof-use-rdb-preamble=yes

当开启混合持久化时,fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件,然后在将重写缓冲区的增量数据以AOF方式写入到文件,写入完成后通知主进程更新统计信息,并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件。
简单的说:新的AOF文件前半段是RDB格式的全量数据后半段是AOF格式的增量数据,

优点:

混合持久化结合了RDB持久化 和 AOF 持久化的优点, 由于绝大部分都是RDB格式,加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。

缺点:

兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,阅读性较差

4 总结

4.1.redis提供了rdb持久化方案,为什么还要aof?

优化数据丢失问题,rdb会丢失最后一次快照后的数据,aof丢失不会超过2秒的数据

4.2.如果aof和rdb同时存在,听谁的?

aof,优先使用aof

4.3.rdb和aof优势劣势

rdb 适合大规模的数据恢复,对数据完整性和一致性不高 , 在一定间隔时间做一次备份,如果redis意外down机的话,就会丢失最后一次快照后的所有操作

aof 根据配置项而定

1.官方建议 两种持久化机制同时开启,如果两个同时开启 优先使用aof持久化机制

4.4 性能建议(这里只针对单机版redis持久化做性能建议)

因为RDB文件只用作后备用途,只要15分钟备份一次就够了,只保留save 900 1这条规则。

如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。

代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。

只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。

默认超过原大小100%大小时重写可以改到适当的数值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值