redis 学习笔记——持久化
redis持久化
snapshot数据快照(rdb)
这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚。redis的snapshot的格式是自定义的rdb格式,名称为XXX.rdb,这是一种被压缩的二进制格式。
redis中的数据快照并非仅仅通过crontab这种形式定期执行任务的,可以设置一定时间内数据被写入/更改的次数来触发snapshot操作。配置 save 60 1000, save 1800 1,表示过去的一分钟内执行1000次写入/更改操作或者过去的30分钟内发生一次相关操作就执行snapshot操作,这个叠加的配置表示在1和30分钟两个维度进行检查。同时redis提供SAVE和BGSAVE两个命令接口方便用户手动操作。
redis的snapshot具体实现是:redis的数据存放到一个共享内存中,然后fork出来一个子进程,子进程从共享内存读取全部的缓存数据进行snapshot操作。当上述的某个触发snapshot的条件满足时,记录下当前的timestamp然后开始snapshot操作,将共享内存中的数据写入一个临时的rdb文件,rdb文件写完后,这个时间点redis的snapshot就完成了。在对共享内存进行snapshot时,新来的写入/更改请求会将要修改的数据从共享内存中拷贝一份到临时的内存块中,然后再对数据按照请求内容进行操作。这其中会有一个很大的问题,临时内存块的大小跟在snapshot过程中发生的相关写/更改请求正相关,当redis接入的数据量很大时,要申请的临时内存块会非常大。所以,目前redis的snapshot这种形式的数据持久化会存在一些问题:额外占用大量内存、如果要尽可能降低数据丢失的风险就需要加大备份的频率,但是增大备份的频率又会增大磁盘I/O、临时内存占用,采用这种方案需要用户有所舍弃。append only log增量写日志(aof)
对每一个写入/更改数据的命令都会采用顺序追加的方式记录到一个增量日志文件(aof)中。基于一个时间点的snapshot和从那个时间点的以来的aof,就可以获取到当前的全部数据。增量日志文件的名称为XXX.aof,该文件记录的就是redis命令的协议表达。redis提供了三种aof写磁盘的方式:appendfsync always, appendfsync everysec, appendfsync no;这三种方式分别对应实时flush、每一秒flush、由系统决定何时flush。第一种太消耗性能,第三种无法保证aof的完整性,第二种是两者的折衷,使用的也比较多。
由于aof是记录数据操作命令的,有可能一条数据对应大量的数据操作命令,而且对于大多数命令,只需要记录最新的命令即可,针对这种情况可以对aof日志进行再处理即rewrite。redis提供的rewrite机制类似snapshot,配置文件中auto-aof-rewrite-percentage、auto-aof-rewrite-min-size这两个参数分别对应超过上次文件的百分比、aof文件的大小,只有这两个条件同时满足时才会触发rewrite操作。还提供了BGREWRITEAOF命令用于手动执行rewrite操作。rewrite的实现机制是:redis进程fork出一个子进程,子进程在触发aof日志rewrite操作的时刻负责将共享内存中的全部数据生成相关的数据处理命令(每条或者多条一个命令),然后将这个命令写入一个临时的aof文件中,与此同时父进程也会创建一个aof rewrite buf chunk,这个时间点之后的写入/更改操作会同时写道原来的aof文件和buf chunk中。子进程在完成新的aof文件的生成后,父进程会将buf chunk中的记录追加到新的aof文件中,然后把旧的aof文件删掉,这样就大大减小了aof文件的大小。同时redis还提供了问题:因为aof rewrite相当于将redis的全部数据进行处理生成相关的redis操作命令,这个过程中对cpu、内存、磁盘I/O等资源的消耗都挺大的。
总结
根据上述所谈到的redis的两种持久化方式,都存在一些问题,两种方式同时开启配合使用,可以最大化的提高redis持久化的可靠性。但是在同时开启这两种方式时,aof的flush、rewrite操作都是磁盘I/O密集型的,而rdb的snapshot也是磁盘I/O密集型,所以此时有可能导致底层调用的写磁盘调用fsync阻塞,因此需要修改no-appendfsync-on-rewrite的
redis 学习笔记——持久化的更多相关文章
- Redis学习笔记六:持久化实验(AOF,RDB)
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- redis学习笔记(3)
redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...
- Redis学习笔记(二) Redis 数据类型
Redis 支持五种数据类型:string(字符串).list(列表).hash(哈希).set(集合)和 zset(有序集合),接下来我们讲解分别讲解一下这五种类型的的使用. String(字符串) ...
- Redis学习笔记4-Redis配置具体解释
在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...
- redis学习笔记(详细)——高级篇
redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
随机推荐
- 判断Bigdecimal类型是否等于0的方法
1.我之前用来判断Bigdecimal类型是否等于0的方法 b.equals(BigDecimal.ZERO); 用equals方法和BigDecimal.ZERO进行比较. 2.上面方法存在的问题 ...
- hdu2049(组合数学)
题意:每位新娘打扮得差点儿一模一样,并盖上大大的红盖头随机坐成一排;然后,让各位新郎寻找自己的新娘.每人仅仅准找一个,而且不同意多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓衣板...如果一共 ...
- [Angular 2] BYPASSING PROVIDERS IN ANGULAR 2
Artical --> BYPASSING PROVIDERS IN ANGULAR 2 Here trying to solve one problem: On the left hand s ...
- keil出错总结
错误一: ..\APP\app.c(51): error: #268: declaration may not appear after executable statement in block ...
- 20、在PC上测试虚拟驱动vivi
在Ubuntu上测试 准备工作:安装xawtv(是一个应用程序,用来在Ubuntu上捕获摄像头数据并显示)sudo apt-get install xawtv 源码xawtv-3.95.tar.gz: ...
- angular2的编译模式之AOT和JIT
原文 https://www.jianshu.com/p/c959d90e91ce 大纲 1.angular应用为什么需要编译 2.angular的编译模式类型 3.JIT(Just-In-Time) ...
- POJ 1562 Oil Deposits (HDU 1241 ZOJ 1562) DFS
现在,又可以和她没心没肺的开着玩笑,感觉真好. 思念,是一种后知后觉的痛. 她说,今后做好朋友吧,说这句话的时候都没感觉.. 我想我该恨我自己,肆无忌惮的把她带进我的梦,当成了梦的主角. 梦醒之后总是 ...
- 【30.93%】【codeforces 558E】A Simple Task
time limit per test5 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...
- GoJS超详细入门(插件使用无非:引包、初始化、配参数(json)、引数据(json)四步)
GoJS超详细入门(插件使用无非:引包.初始化.配参数(json).引数据(json)四步) 一.总结 一句话总结:插件使用无非:引包.初始化.配参数(json).引数据(json)四步. 1.goj ...
- php求二叉树的深度(1、二叉树就可以递归,因为结构和子结构太相似)(2、谋而后动,算法想清楚,很好过的)
php求二叉树的深度(1.二叉树就可以递归,因为结构和子结构太相似)(2.谋而后动,算法想清楚,很好过的) 一.总结 1.二叉树就可以递归,因为结构和子结构太相似 2.谋而后动,算法想清楚,很好过的 ...