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 ...
随机推荐
- 【】minimum
[链接]h在这里写链接 [题意] 给两个数字a,b,每次操作可以把a+1a+1,或把a∗k 问至少多少次操作可以使得a=b. 1<=a,b<=10^18,0 <= k <= 1 ...
- 洛谷——P1774 最接近神的人_NOI导刊2010提高(02)
https://www.luogu.org/problem/show?pid=1774 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古 ...
- js进阶 12-14 jquery的事件触发函数是哪两个
js进阶 12-14 jquery的事件触发函数是哪两个 一.总结 一句话总结:trigger和triggerHandler 1.trigger传额外参数时候的注意事项是什么? 注意样例中是三个参数 ...
- C语言深度剖析-----多维数组和多维指针
多维数组和多维指针 指向指针的指针 指针变量同样也有传址调用和传值调用 case1:估算要5个字节的空间,实际只用前面3个字节,设计释放空的2字节 case2:扩充到10字节 二维数组与二维指针 二维 ...
- pcb过孔盖油
pcb的过孔应该盖油,,这样,两个距离比较紧的过孔就不会在焊接的时候短路了,尤其是手工焊接小件的时候.
- POJ 2479 Maximum sum POJ 2593 Max Sequence
d(A) = max{sum(a[s1]..a[t1]) + sum(a[s2]..a[t2]) | 1<=s1<=t1<s2<=t2<=n} 即求两个子序列和的和的最大 ...
- MySQL启动关闭添加到 /etc/init.d/mysqld
cp /data/mysql/support-files/mysql.server /etc/init.d/mysqld 然后就可以使用此命令启动/关闭 mysql: /etc/ini ...
- angular的学习参考材料
原文地址:https://www.jianshu.com/p/b9db7bb3d4ec 目的 其实写这篇文章的主要目的是为了提供给那些刚刚入门angular或者有意学习angular的读者准备的. 我 ...
- EntityFrameworkCore 中的 Attach 方法
Attach 的坑 Model Filed Database Value Console Value User Phone +123000000000 +12333333333 User Email ...
- STL algorithm算法make_heap和sort_heap(32)
make_heap原型: std::make_heap default (1) template <class RandomAccessIterator> void make_heap ( ...