基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
面试官:你来说说Redis两种持久化方式的优缺点
面试官:你来说说Redis两种持久化方式的优缺点
阅读
1
2020-08-31
:
001
期~
150
期汇总,方便阅读,不断更新中.....
redis两种持久化的方式
RDB
持久化可以在指定的时间间隔内生成数据集的时间点快照
AOF
持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,
AOF
文件中全部以
redis
协议的格式来保存,新命令会被追加到文件的末尾,
redis
还可以在后台对
AOF
文件进行重写,文件的体积不会超出保存数据集状态所需要的实际大小,
redis
还可以同时使用
AOF
持久化和
RDB
持久化,在这种情况下,当
redis
重启时,它会有限使用
AOF
文件来还原数据集,因为
AOF
文件保存的数据集通常比
RDB
文件所保存的数据集更加完
RDB的优点
RDB
是一个非常紧凑(
compact
)的文件,它保存了
Redis
在某个时间点上的数据集。这种文件非常适合用于进行备份:比如说,你可以在最近的
24
小时内,每小时备份一次
RDB
文件,并且在每个月的每一天,也备份一个
RDB
文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
RDB
非常适用于灾难恢复(
disaster
recovery
):它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊
S3
中。
RDB
可以最大化
Redis
的性能:父进程在保存
RDB
文件时唯一要做的就是
fork
出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘
I
/
O
操作。
RDB
在恢复大数据集时的速度比
AOF
的恢复速度要快
RDB的缺点
如果你需要尽量避免在服务器故障时丢失数据,那么
RDB
不适合你。虽然
Redis
允许你设置不同的保存点(
save
point
)来控制保存
RDB
文件的频率, 但是, 因为
RDB
文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。因此你可能会至少
5
分钟才保存一次
RDB
文件。在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。
每次保存
RDB
的时候,
Redis
都要
fork
() 出一个子进程,并由子进程来进行实际的持久化工作。在数据集比较庞大时,
fork
()可能会非常耗时,造成服务器在某某毫秒内停止处理客户端;如果数据集非常巨大,并且
CPU
时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。虽然
AOF
重写也需要进行
fork
() ,但无论
AOF
重写的执行间隔有多长,数据的耐久性都不会有任何损失。
AOF 的优点
使用
AOF
持久化会让
Redis
变得非常耐久(
much
more
durable
):你可以设置不同的
fsync
策略,比如无
fsync
,每秒钟一次
fsync
,或者每次执行写入命令时
fsync
。
AOF
的默认策略为每秒钟
fsync
一次,在这种配置下,
Redis
仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据(
fsync
会在后台线程执行,所以主线程可以继续努力地处理命令请求)。
AOF
文件是一个只进行追加操作的日志文件(
append
only
log
), 因此对
AOF
文件的写入不需要进行
seek
, 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等),
redis
-
check
-
aof
工具也可以轻易地修复这种问题。
Redis
可以在
AOF
文件体积变得过大时,自动地在后台对
AOF
进行重写:重写后的新
AOF
文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为
Redis
在创建新
AOF
文件的过程中,会继续将命令追加到现有的
AOF
文件里面,即使重写过程中发生停机,现有的
AOF
文件也不会丢失。而一旦新
AOF
文件创建完毕,
Redis
就会从旧
AOF
文件切换到新
AOF
文件,并开始对新
AOF
文件进行追加操作。
AOF
文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以
Redis
协议的格式保存, 因此
AOF
文件的内容非常容易被人读懂, 对文件进行分析(
parse
)也很轻松。导出(
export
)
AOF
文件也非常简单:举个例子, 如果你不小心执行了
FLUSHALL
命令, 但只要
AOF
文件未被重写, 那么只要停止服务器, 移除
AOF
文件末尾的
FLUSHALL
命令, 并重启
Redis
, 就可以将数据集恢复到
FLUSHALL
执行之前的状态。
AOF 的缺点
对于相同的数据集来说,
AOF
文件的体积通常要大于
RDB
文件的体积。
根据所使用的
fsync
策略,
AOF
的速度可能会慢于
RDB
。在一般情况下, 每秒
fsync
的性能依然非常高, 而关闭
fsync
可以让
AOF
的速度和
RDB
一样快, 即使在高负荷之下也是如此。不过在处理巨大的写入载入时,
RDB
可以提供更有保证的最大延迟时间(
latency
)。
AOF
在过去曾经发生过这样的
bug
:因为个别命令的原因,导致
AOF
文件在重新载入时,无法将数据集恢复成保存时的原样。(举个例子,阻塞命令
BRPOPLPUSH
就曾经引起过这样的
bug
。) 测试套件里为这种情况添加了测试:它们会自动生成随机的、复杂的数据集, 并通过重新载入这些数据来确保一切正常。虽然这种
bug
在
AOF
文件中并不常见, 但是对比来说,
RDB
几乎是不可能出现这种
bug
的
来源:
cnblogs
.
com
/
ssssdy
/
p
/
7132856
.
html
? ~
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
三天两夜肝完这篇万字长文,看完它,面试再也不用怕被问到 TCP/IP 了
下一篇:
面试官:你能说出Springboot项目启动的几种方式吗?
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目