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 ...
随机推荐
- Surging 分布式微服务框架使用入门
原文:Surging 分布式微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与S ...
- 读文件头数据判断 PE 文件格式和类型
namespace X.Reflection { using System; using System.IO; public static partial class ReflectionX { pu ...
- [React] Style a React component with styled-components
In this lesson, we remove the mapping between a React component and the styles applied to it via cla ...
- zynq mac地址修改
工作中遇到多个zynq板子同时位于一个交换机网络中,由于默认mac地址相同,无法进行通信,因此需要对每个板子修改mac地址. 方案:使用uboot配置文件 步骤: 在uboot配置文件中添加及修改下面 ...
- Android——WebView方式开发web App
昨天接到个酬劳丰厚的任务.把java新生系统做成webApp,想想蛮简单的.所以当时就装作非常为难的样子答应了. 所谓Web App,用曾经我那个老PM的话来说.就是在壳里面套上页面.这里的壳相当于浏 ...
- chain rule 到 Markov chain
1. 联合概率(joint distribution)的链式法则 基于链式法则的 explicit formula: p(x1:n)===p(x)p(x1)∏i=2np(xi|x1,-,xi−1)∏i ...
- strace跟踪线程调用
方法一:strace -fp pid , 可以跟踪所有线程, 进程的系统调用. [root@xxxx]strace -p 24091 Process xxx attached - interrupt ...
- Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层訪问硬件驱动 中我们已经编译好了硬件抽象层模块,以下就要開始为H ...
- ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...
- CISCO - 查找命令行
http://www.cisco.com/c/en/us/support/web/tools/help/command_search_best_practices.html Support Best ...