Redis 中的数据持久化策略(AOF)
上一篇文章,我们讲的是 Redis 的一种基于内存快照的持久化存储策略 RDB,本质上他就是让 redis fork 出一个子进程遍历我们所有数据库中的字典,进行磁盘文件的写入。
但其实这种方式是有缺点的,先不说阻塞式 save 调用会阻塞整个 redis 服务,即便异步式 bgsave 也是基于时间间隔,每多少秒触发了多少次更新操作才会生成 RDB 文件,那么如果某次 RDB 生成之后,紧接着服务宕机,就至少丢失几秒甚至更多的数据,并且这些数据是无法挽回的。
而 AOF 是 redis 中的另一种数据持久化策略,它基于操作日志,也是一个很优秀的持久化策略,当然也有缺点。那么本篇就来讲讲这个 AOF 持久化策略。
一、什么是 AOF 持久化策略
AOF 即 append only file,当 redis 采用这这种数据持久化策略的时候,每当 redis 服务器收到一条更新命令时,操作结束之后会将这条命令添加到 aof 内存缓冲区,特定的时间下刷新缓冲区到磁盘文件中,也就是我们的 aof 文件。
默认的 redis 启动配置文件中,会有这么两条配置:
appendonly 指定 redis 是否启用 AOF 持久化策略,appendfilename 指明生成的 AOF 文件名称。
你也可以将 appendonly 选项指定为 yes,然后执行一条 set 命令,看看 redis 根目录下有没有生成一个 appendonly.aof 文件。
redis.conf 中还有 appendfsync 这么一条配置,它指明 AOF 文件的写入频率,即便 linux 中文件 IO 使用的高效的 epoll,但每收到一条更新命令就进行一次文件 IO,未免也太低效,况且也没必要。
appendfsync 的配置项有以下三种值可选:
- always:每一次系统 serverCorn 函数调用就刷新一次缓存区
- everysec:每秒执行一次磁盘写入,期间所有的命令都会存储在 aof 缓存区
- no:不做控制,任由操作系统决定什么时候刷新缓冲区
redis 默认配置是 everysec,即每秒刷新一次缓存区。
二、AOF 重写
所以,理论上来说,随着 redis 服务器运行时间的持续,生成的 aof 文件只会越来越大,redis 提供 AOF 重写策略帮助优化和压缩 aof 文件。
比如:
set a "a"
set b "b"
set c "c"
del a
del b
正常情况下,aof 文件中会保存着五条命令的 log,然后数据恢复的时候依次执行即可。而当你启动 AOF 重写后,实际上我们的 aof 文件中只有 set c "c" 这一条命令的 log。
以上只是一个简单的示例,实际上 AOF 重写达到的效率比这优秀的多的多,往往能将几百条甚至几千条的命令日志,重写优化成个位数。带给我们最直观的好处就是,aof 文件体积变小,数据恢复速度变快。
一般来说,我们可以通过向 redis 服务器发送 bgrewriteaof 命令触发服务器对 aof 文件进行重写,如果当前有正在运行的重写子进程,则本次重写 会推迟执行,否则,直接触发一次重写。
除此之外,我们还可以在配置文件中配置 aof 文件达到多大,自动触发文件重写。
因为 aof 文件重写一样是 fork 子进程并由子进程处理的,主进程依然提供服务,所以 redis 还提供一块重写缓冲区,当发现有子进程正在进行 aof 文件重写,最新的请求命令除了会添加到 AOF 缓冲区,还会添加进 AOF 重写缓冲区,当子进程完成重写任务后,主进程阻塞式将重写缓冲区的命令日志添加进最新的 aof 文件中。
看几条配置
no-appendfsync-on-rewrite 配置了当 redis 服务器因为某些情况即将阻塞(例如 save)时是否需要将缓冲区中的 aof 命令写入到磁盘,配置 yes 则每次遇到阻塞操作时刷新缓存到磁盘,配置为 no 则无需关心服务器阻不阻塞,缓存命令在缓存区。
auto-aof-rewrite-percentage 配置了当 aof 文件相较于上一版本的 aof 文件大小的百分比达到多少时触发 AOF 重写。举个例子,auto-aof-rewrite-percentage 选项配置为 100,上一版本的 aof 文件大小为 100M,那么当我们的 aof 文件达到 200M 的时候,触发 AOF 重写。
auto-aof-rewite-min-size 配置了最小能容忍 aof 文件大小,超过这个大小必须进行 AOF 重写。
三、RDB 与 AOF
RDB 基于内存快照,有两种方式 save 和 bgsave,前者会阻塞 redis 服务,后者是异步 fork 子进程不影响主进程提供服务。大部分情况,我们会通过配置时间间隔触发 RDB 文件写入。RDB 文件中保存的是 redis 内存中所有的数据一份快照。
优点是:
- 相同的数据量下,rdb 文件要小于 aof 文件,且恢复速度要快于 aof
- rdb 文件中是整个数据的完整备份快照,数据存储紧凑即便不同版本的 redis,也能顺利恢复
- 整个 rdb 持久化,只需要 fork 一个子进程进行持久化即可,父进程依然可以提供服务,效率最大化
缺点是:
- 容易丢失数据,即便配置了事件时间触发备份,也至少丢失一秒数据
- 如果数据量太大,fork 子进程的时候会阻塞毫秒级别时间
AOF 是基于命令操作日志,每条更新命令都会被刷到缓存区,然后在特定的时间节点被写入 aof 磁盘文件。
优点是:
- 相较于 RDB,AOF 数据可靠性更强,最多丢失一秒数据
- 数据库容错率变好,一些误操作可以通过直接改 aof 文件进行回退
缺点是:
- AOF 文件通常较大且恢复效率比不上 RDB,不适合做数据冷备份
总的来说,AOF 策略会使数据稳定性更高,具有更完整的数据备份,RDB 恢复效率高适合做灾难恢复,建议生产环境上两者都开启。
ps:Redis 官方号称后续出一个新的持久化策略,整合 RDB 和 AOF 提供更高效率的数据持久化,期待中。
Redis 中的数据持久化策略(AOF)的更多相关文章
- Redis 中的数据持久化策略(RDB)
Redis 是一个内存数据库,所有的数据都直接保存在内存中,那么,一旦 Redis 进程异常退出,或服务器本身异常宕机,我们存储在 Redis 中的数据就凭空消失,再也找不到了. Redis 作为一个 ...
- Redis数据持久化机制AOF原理分析一---转
http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...
- Redis进阶:数据持久化,安全,在PHP中使用
一.redis数据持久化 由于redis是一个内存数据库,如果系统遇到致命问题需要关机或重启,内存中的数据就会丢失,这是生产环境所不能允许的.所以redis提供了数据持久化的能力. redis提供了两 ...
- 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots
读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots 以下为异常详细信息: Exception in thread &q ...
- 动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略
我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题, ...
- Redis 中的过期删除策略和内存淘汰机制
Redis 中 key 的过期删除策略 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 ...
- iOS中的数据持久化方式
iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...
- IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...
- Android中的数据持久化机制
Android中几种最简单但是却最通用的数据持久化技术:SharedPreference.实例状态Bundle和本地文件. Android的非确定性Activity和应用程序生存期使在会话间保留UI状 ...
随机推荐
- 19.yield和send的区别
转载:https://www.jianshu.com/p/ccb5e7da3fd8 https://www.cnblogs.com/xhcdream/p/8304953.html https://ww ...
- 第三阶段:3.Web端产品设计:5.产品设计-视觉设计
视觉设计主要在表现层. 色彩心理产品经理可以也是应当掌握的.什么颜色的选择都是有理有据的. 信息清晰度. 比如这个图:当用户操作出问题,谷歌会给出问题同时给出解决方法. 视觉动物. 2/8分布原则.用 ...
- 关于QT中的隐式共享
网上关于隐式共享的解释很多,在此不再陈述.本文主要是记录一下自己学习隐式共享的坑点: 即:隐式共享只发生在非指针的情况下!!!! 如下代码: QImage image1; QImage image2; ...
- [梁山好汉说IT] 容器概念在北宋社会的应用
[梁山好汉说IT] 容器概念在北宋社会的应用 0x00 摘要 如何对没有软件开发经验的人解释容器? 集装箱真的能够完美解释容器嘛? 除了集装箱还有其他常见实体能够解释容器嘛? 我找到了一个能够 和集装 ...
- mysql 时间函数总结
1. 获取当前时间 select now(); // 2018-08-24 11:01:26 select unix_timestamp(); // 1535079695 总结:unix_ ...
- 从零开始のcocos2dx生活(七)ParticleSystem
CCParticleSystem是用来设置粒子效果的类 1.粒子分为两种模式:重力模式 和 半径模式 重力模式独占属性: gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小 spe ...
- C# 添加文本、图片到PDF文档(基于Spire.Cloud.PDF.SDK)
Spire.Cloud.PDF.SDK提供了接口PdfTextApi及PdfImagesApi用于添加文本和图片到PDF文档,添加文本时,可格式化文本样式,包括文本字体类型.字号.字体样式.文本颜色. ...
- 【一起学源码-微服务】Ribbon源码五:Ribbon源码解读汇总篇~
前言 想说的话 [一起学源码-微服务-Ribbon]专栏到这里就已经全部结束了,共更新四篇文章. Ribbon比较小巧,这里是直接 读的spring cloud 内嵌封装的版本,里面的各种config ...
- 常见的sql注入环境搭建
常见的sql注入环境搭建 By : Mirror王宇阳 Time:2020-01-06 PHP+MySQL摘要 $conn = new mysqli('数据库服务器','username','pass ...
- schedule of 2016-09-12~2016-09-18(Monday~Sunday)——1st semester of 2nd Grade
2016/9/12 Monday 1.send present to Teacher Wei&hu 2.make ppt for 1st database 2.0 meeting for al ...