当前位置:首页 > 缓存 > 正文内容

redis中持久化机制对比

phpmianshi4年前 (2017-04-02)缓存150

RDB filesnapshotting

1.按特定的时间间隔来为数据集做快照

2.每次持久化都是将全量数据写入,而不是增量

3.每次写入时先将数据写入临时文件再替换掉原来的rdb文件

优点:

1.RDB是一个单独的文件,方便备份以及灾难恢复

2.写数据的模式为parent进程fork出一个子进程来进行磁盘io操作,而parent进程则不需要参与io操作

3.在数据比较大的情况下,启动速度比AOF快

缺点:

1.该模式下如果redis崩溃或者断电情况下可能有数据丢失;因为RDB是按照固定策略(如10秒刷入一次或者5分钟内写入100条数据则刷入磁盘等)来持久化的,那么则断电或者服务崩溃的情况下可能会丢失某一个时间段的数据

2.RDB在进程持久化时需要fork子进程来做磁盘操作,当数据集比较大时fork操作非常耗时,而且在fork过程中server是不能对client服务的;AOF虽然也需要fork但是我们可以设置多久重写一次日志

AOF Append-only

1.服务端为每个写操作记录日志;

2.如果服务重启,则根据所记录的log来进行重放来重建整个数据集。

3.日志的记录使用的是redis自己的协议,以追加的模式记录。

4.如果日志过大,redis可以在后台重写日志文件

优点:

1.AOF文件刷新的方式,有三种,参考配置参数appendfsync :

appendfsync always每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全;appendfsync everysec每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据;appendfsync no依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾。

2.日志文件是追加模式,在断电后不牵扯到文件指针查找以及数据丢失问题;就算是因为某些原因(如磁盘写满等)导致日志文件最后一条只写入了一半也可以通过redis-check-aof工具来修复

首先做一个AOF文件的备份,复制到其他地方;修复原始AOF文件,执行:$ redis-check-aof –fix ;可以通过diff –u命令来查看修复前后文件不一致的地方;重启redis服务。

3.当日志文件过大时,redis会自动重写日志文件(新的文件只保留创建当前数据集需要用到的命令);在重写的过程中同时还会往老的日志文件写入,一旦新的文件处理完成,redis会切换至新的文件

4.日志文件内容简单清晰,方便人工干预。例如我们调用flushall来刷新保存所有数据失败,如果此时日志文件没有其他命令写入,我们可以停掉server,删掉日志中最后一条错误,然后重新启动来恢复数据

缺点:

1.相同数据集下,AOF模式对应文件通常比RDB对应文件大

2.AOF在某些策略下比RDB模式慢。比如,将fsync设置为每秒一次时,性能仍然很高;将fsync禁用时,性能和RDB接近

3.有些命令可能在AOF下有问题,如BRPOPLPUSH命令在AOF下重新加载时重放失败

说明:

在同一个实例中可以同时使用RDB和AOF持久化机制;但是在服务启动时优先使用AOF机制来重建数据集(因为AOF最大程度的保留了数据的完整性),如果没有aof日志,就会使用rdb文件来恢复。

如果再问aof文件过大恢复时间过长怎么办?

Redis会定期做aof重写,压缩aof文件日志大小。

Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。

总结

1.如果要严格保证数据完整性,则RDB与AOF同时使用

2.如果可以容忍少量数据丢失,则使用RDB

3.不建议单独使用AOF(因为RDB备份更方便,重新启动相对较快;AOF可能有bug)





版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

redis中底层的编码转换

redis中底层的编码转换

编码转化Redis 使用对象(redisObject)来表示数据库中的键值,当我们在 Redis 中创建一个键值对时,至少创建两个对象,一个对象是用做键值对的键对象,另一...

Redis中主从复制的原理详解

主从复制的方式命令slaveof。优点:无需重启。缺点:不便于管理 // 命令行使用 slaveof ip port // 使用命令后自身...

redis中过期数据的删除以及对性能的影响

过期数据的删除对Redis性能影响当我们对某些 key 设置了 expire 时,数据到了时间会自动删除。如果一个键过期了,它会在什么时候删除呢?下面介绍三种删...

redis中缓存穿透与缓存雪崩缓存击穿

背景缓存系统不得不考虑的另一个问题是缓存穿透与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致...

memcached中telnet连接命令使用详解

连接 memcachedtelnet连接memcached,输入命令telnet 127.0.0.1 11211查看是否正常查看一下memcache是否正常,输入命令 statss...

redis中字符串的底层实现-SDS

redis中字符串的底层实现-SDS

概述Redis 是用 C 语言开发完成的,但在 Redis 字符串中,并没有使用 C 语言中的字符串,而是用一种称为 S...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。