search
HomeDatabaseMysql TutorialRedis数据持久化机制AOF原理分析之配置详解
Redis数据持久化机制AOF原理分析之配置详解Jun 07, 2016 pm 03:28 PM
aofredisanalyzeprincipleEndurancedatamechanismConfiguration

本文所引用的源码全部来自Redis2.8.2版本。 Redis的配置文件为redis.conf, 对配置文件的解析代码见config.c 原创文章转载请注明,本文来自http://blog.csdn.net/acceptedxukai/article/details/18135219 AOF实现机制简介 AOF 即Append Only File,实现机制:R

本文所引用的源码全部来自Redis2.8.2版本。

Redis的配置文件为redis.conf, 对配置文件的解析代码见config.c

原创文章转载请注明,本文来自http://blog.csdn.net/acceptedxukai/article/details/18135219

AOF实现机制简介

AOF 即Append Only File,实现机制:Redis将数据库做个快照,遍历所有数据库,将数据库中的数据还原为跟客户端发送来的指令的协议格式的字符串,然后Redis新建一个临时文件将这些快照数据保存,待快照程序结束后将临时文件名修改为正常的aof文件名,原有的文件则自动丢弃,由于在快照进行的过程中可能存在新增的命令修改了数据库中的数据,则在快照程序结束后需要将新修改的数据追加到aof文件中,后续的从客户端过来的命令都会不断根据不同的安全级别写到磁盘里面去。这样就支持了实时的持久化,只是可能会有短时间内的数据丢失,对一般系统还是可以容忍的。

配置文件redis.conf中有关AOF参数配置解释

appendonly

含义:Redis Server是否开启AOF持久化机制

在config.c函数loadServerConfigFromString解析代码为

 

if (!strcasecmp(argv[0],"appendonly") && argc == 2) {
	int yes;
	if ((yes = yesnotoi(argv[1])) == -1) {
		err = "argument must be 'yes' or 'no'"; goto loaderr;
	}
	server.aof_state = yes ? REDIS_AOF_ON : REDIS_AOF_OFF;
}

 

appendfsync

含义:Redis将OS数据缓冲区中数据刷新到磁盘的策略

# appendfsync always 只要有新添加的数据就fsync
appendfsync everysec 支持延迟fsync
# appendfsync no 不需要fsync
config.c中解析代码

 

if (!strcasecmp(argv[0],"appendfsync") && argc == 2) {//AOF fsync策略
	if (!strcasecmp(argv[1],"no")) {
		server.aof_fsync = AOF_FSYNC_NO;
	} else if (!strcasecmp(argv[1],"always")) {
		server.aof_fsync = AOF_FSYNC_ALWAYS;
	} else if (!strcasecmp(argv[1],"everysec")) {
		server.aof_fsync = AOF_FSYNC_EVERYSEC;
	} else {
		err = "argument must be 'no', 'always' or 'everysec'";
		goto loaderr;
	}
}

 

no-appendfsync-on-rewrite

含义:当rewrite AOF子进程或RDB子进程正在执行时,Server是否支持fsync,即当新修改的数据写入AOF文件后,是否将数据刷新到硬盘

config.c中解析代码

 

if (!strcasecmp(argv[0],"no-appendfsync-on-rewrite") && argc == 2) {
	if ((server.aof_no_fsync_on_rewrite= yesnotoi(argv[1])) == -1) {
		err = "argument must be 'yes' or 'no'"; goto loaderr;
	}
}
server.aof_no_fsync_on_rewrite控制该机制的实现代码在aof.c的flushAppendOnlyFile函数中,具体代码为

 

 

//如果不支持fsync,或者aof rdb子进程正在运行,那么直接返回,
//但是数据已经写到aof文件中,只是没有刷新到硬盘
if (server.aof_no_fsync_on_rewrite &&
	(server.aof_child_pid != -1 || server.rdb_child_pid != -1))
		return;

 

appendfilename

含义:AOF的文件名
 

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

这两个配置就暂不解释,见下面redisServer结构体中中有关AOF参数的注释

redisServer数据结构中有关AOF的参数

 

struct redisServer {
	…………
	
    /* AOF persistence */
    int aof_state;                  /* REDIS_AOF_(ON|OFF|WAIT_REWRITE) */
    int aof_fsync;                  /* Kind of fsync() policy */
    char *aof_filename;             /* Name of the AOF file */
    int aof_no_fsync_on_rewrite;    /* Don't fsync if a rewrite is in prog. */
    int aof_rewrite_perc;           /* Rewrite AOF if % growth is > M and... */
    off_t aof_rewrite_min_size;     /* the AOF file is at least N bytes. */ aof文件最小字节数
    off_t aof_rewrite_base_size;    /* AOF size on latest startup or rewrite. */ 上一次aof文件的大小
    off_t aof_current_size;         /* AOF current size. */ 当前aof文件的大小
    int aof_rewrite_scheduled;      /* Rewrite once BGSAVE terminates. */
    pid_t aof_child_pid;            /* PID if rewriting process */ 子进程的pid
    list *aof_rewrite_buf_blocks;   /* Hold changes during an AOF rewrite. */
    sds aof_buf;      /* AOF buffer, written before entering the event loop */
    int aof_fd;       /* File descriptor of currently selected AOF file */ aof文件描述符
    int aof_selected_db; /* Currently selected DB in AOF */
    time_t aof_flush_postponed_start; /* UNIX time of postponed AOF flush */
    time_t aof_last_fsync;            /* UNIX time of last fsync() */
    time_t aof_rewrite_time_last;   /* Time used by last AOF rewrite run. */
    time_t aof_rewrite_time_start;  /* Current AOF rewrite start time. */
    int aof_lastbgrewrite_status;   /* REDIS_OK or REDIS_ERR */
    unsigned long aof_delayed_fsync;  /* delayed AOF fsync() counter */
    int aof_rewrite_incremental_fsync;/* fsync incrementally while rewriting? */
	
	…………
}

 

字符串aof_buf与链表aof_rewrite_buf_blocks分别是追加AOF文件与rewrite AOF文件后处理差异数据的重要参数

initServerConfig函数对AOF参数的初始化及注释

 

 

server.aof_state = REDIS_AOF_OFF;            //AOF文件是否开启
server.aof_fsync = REDIS_DEFAULT_AOF_FSYNC;  //fsync策略,默认为每秒fsync
server.aof_no_fsync_on_rewrite = REDIS_DEFAULT_AOF_NO_FSYNC_ON_REWRITE;//aof rdb子进程运行中是否支持fsync,即写入AOF文件后,将数据刷新到硬盘
server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC; //自动rewrite增量值
server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE; //AOF文件最小字节数
server.aof_rewrite_base_size = 0;   //自动rewrite计算aof文件增量的基数,等于上一次aof文件的字节数
server.aof_rewrite_scheduled = 0;   //rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待AOF子进程结束后执行rewrite
server.aof_last_fsync = time(NULL); //最近fsync数据到硬盘时间
server.aof_rewrite_time_last = -1;  //rewrite持续的时间
server.aof_rewrite_time_start = -1; //rewrite开始的时间
server.aof_lastbgrewrite_status = REDIS_OK; //rewrite后的状态
server.aof_delayed_fsync = 0; //延迟fsync到硬盘的次数
server.aof_fd = -1;   //AOF文件描述符
server.aof_selected_db = -1; /* Make sure the first time will not match */
server.aof_flush_postponed_start = 0; //上次推迟fsync到硬盘的时间
server.aof_rewrite_incremental_fsync = REDIS_DEFAULT_AOF_REWRITE_INCREMENTAL_FSYNC;//rewrite AOF文件时是否采用增量式fsync
其中aof_current_size参数未初始化,该值的初始化在Server启动加载AOF文件数据时初始化。

 

小结

本文就是简单介绍Redis中有关AOF机制实现的相关参数的意义,方便对接下来AOF数据持久化机制的理解,AOF机制的实现比较复杂,大致分为Server启动加载AOF文件数据、将新的数据追加到AOF文件中、自动rewrite AOF文件、客户端请求BGREWRITEAOF指令四个部分,下面的博客将介绍这三个部分的实现。
 

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
es和redis区别es和redis区别Jul 06, 2019 pm 01:45 PM

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

一起来聊聊Redis有什么优势和特点一起来聊聊Redis有什么优势和特点May 16, 2022 pm 06:04 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

实例详解Redis Cluster集群收缩主从节点实例详解Redis Cluster集群收缩主从节点Apr 21, 2022 pm 06:23 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

详细解析Redis中命令的原子性详细解析Redis中命令的原子性Jun 01, 2022 am 11:58 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

Redis实现排行榜及相同积分按时间排序功能的实现Redis实现排行榜及相同积分按时间排序功能的实现Aug 22, 2022 pm 05:51 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

实例详解Redis实现排行榜及相同积分按时间排序功能的实现实例详解Redis实现排行榜及相同积分按时间排序功能的实现Aug 26, 2022 pm 02:09 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

一文搞懂redis的bitmap一文搞懂redis的bitmapApr 27, 2022 pm 07:48 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

一起聊聊Redis实现秒杀的问题一起聊聊Redis实现秒杀的问题May 27, 2022 am 11:40 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于实现秒杀的相关内容,包括了秒杀逻辑、存在的链接超时、超卖和库存遗留的问题,下面一起来看一下,希望对大家有帮助。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment