Redis持久化机制

2021/7/14 19:05:39

本文主要是介绍Redis持久化机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Redis持久化机制:

RDB快照
AOF日志

一. RDB快照

1.概念

RDB是把当前进程数据生成快照保存到硬盘的过程(以二进制方式写入磁盘)

2.触发机制: 手动和自动

【1】手动触发分别对应save和bgsave命令

·save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用
·bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短

【2】自动触发就是在配置文件中使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改 时,自动触发bgsave

3.优缺点

产生的文件小,恢复速度快, 由于每次生成RDB开销较大(需要fork子进程,属于重量级操作,会导致redis卡顿若干秒),无法做到实时持久化

4.禁用持久化

命令 config set save ""

二. AOF日志

1.概念

以独立日志的方式记录每次命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用 是解决了数据持久化的实时性

2.开启方式

查询aof是否开启: 
命令 config get appendonly

开启AOF:
1)命令行(实时生效,但重启后失效):
config set appendonly

2)配置文件(需重启生效):
appendonly yes,默认不开启

3.触发策略

手动触发:
执行命令 bgrewriteaof

3种自动触发:
(1)每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
(2)每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失(推荐)
(3)不同no:从不同步

4.AOF工作流程

1.所有写入命令追加到aof_buf缓冲区(redis是单线程响应命令,如果每次命令都直接追加到磁盘,会影响磁盘的负载)

2.aof缓冲区根据对应的策略向磁盘做同步操作

3.随着aof文件越来越大,需要定期对aof文件进行重写,达到压缩目的

4.redis重启时,可以加载aof文件进行数据恢复

5.AOF重写机制

原因: 
AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多.当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩

重写原理: 
Redis 会fork出一条新进程,读取内存中的数据,并重新写到一个临时文件中...最后替换旧的aof文件

触发机制:
当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。这里的“一倍”和“64M” 可以通过配置文件修改

手动触发:
直接调用bgrewriteaof命令。
自动触发:
根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机

·auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认 为64MB。
·auto-aof-rewrite-percentage:代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。
自动触发时机=aof_current_size > auto-aof-rewrite-minsize &&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewritepercentage

三. RDB和AOF同时开启可能存在的坑

场景: 如果redis以rdb模式运行了,然后关闭redis,配置文件配置开启aof,重启redis,此时会发现redis中没有数据

原因: redis会优先基于aof去恢复,,即使没有.aof文件,,他会创建一个新的空的.aof文件....

解决方案:
停止redis,关闭aof,拷贝rdb备份,重启redis,确认数据恢复,
直接在命令行热修改redis配置(redis的客户端执行命令:    config set appendonly yes),打开aof,
这时redis就会将内存中的数据对应的日志,写入aof文件中, 此时aof和rdb两份数据文件的数据就同步了

 



这篇关于Redis持久化机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程