Redis之AOF文件持久化

如何避免redis长期运行持久化AOF文件过大的问题:AOF重写 通过 重建 AOF 文件,解决以下问题: 体积压缩:消除冗余命令(如多次修改同一 key),生成最小操作集合。 混合持久化支持(若启用 aof-use-rdb-preamble yes):生成 RDB 头部 + 增量 AOF 命令。 数据一致性:确保 AOF 文件仅包含有效数据集的完整操作记录。 阅读详情

Redis之AOF文件持久化

一、AOF持久化介绍

Redis除了使用RDB文件持久化数据库外,还提供了AOF持久化功能,与RDB持久化的区别如下:

(1) RDB持久化通过保存数据库中键值对来记录数据库的状态,AOF持久化是通过记录服务器所执行的命令来保存数据库的状态的

这里写图片描述

(2) AOF文件的更新频率要高于RDB文件,所以如果服务器开启了AOF文件持久化功能,那么服务器会优先使用AOF文件进行还原数据库的状态,只有在AOF文件持久化功能被关闭的时候服务器才使用RDB文件来还原数据库

这里写图片描述

二、AOF持久化的大体实现过程

AOF文件持久化功能的实现大体分为四个过程,分别是:

(1) 根据协议构造存储的格式;(2)命令追加;(3)文件写入;(4)文件同步;

2.1 根据协议构造存储的命令格式

被写入到AOF文件中的命令都是纯文本格式。相比于RDB文件的存储格式,AOF文件的存储格式要简单得多,对于AOF文件中的一条命令,其保存的格式如下:

*<count>    // <count>表示该命令有2个参数
$<len>     // <len>表示第1个参数的长度
<content>   // <content>表示第1个参数的内容
$<len>     // <len>表示第2个参数的长度
<content>   // <content>表示第2个参数的内容
...

构造命令格式的代码如下:

/* 根据输入的字符串,进行参数包装,再次输出 */
sds catAppendOnlyGenericCommand(sds dst, int argc, robj **argv) {
    char buf[32];
    int len, j;
    robj *o;

    buf[0] = '*';
    // 得到命令参数的个数,ll2string是将long类型转化为string并返回长度
    len = 1+ll2string(buf+1,sizeof(buf)-1,argc);
    buf[len++] = '\r';
    buf[len++] = '\n';
    // 追加字符到末尾
    dst = sdscatlen(dst,buf,len);

    for (j = 0; j < argc; j++) {
        // 获取解码后的robj
        o = getDecodedObject(argv[j]);
        buf[0] = '$';
        len = 1+ll2string(buf+1,sizeof(buf)-1,sdslen(o->ptr));
        buf[len++] = '\r';
        buf[len++] = '\n';
        dst = sdscatlen(dst,buf,len);
        dst = sdscatlen(dst,o->ptr,sdslen(o->ptr));
        dst = sdscatlen(dst,"\r\n",2);
        // 递减robj中的引用计数,引用到0后,释放对象
        decrRefCount(o);
    }
    return dst;
}
2.2 命令追加

当AOF文件持久化功能打开后,服务器在执行完一个命令后,按照保存的格式将命令追加到aof_buf缓冲区末尾,

struct redisServer{
    sds aof_buf;
}
/* 根据cmd的不同操作,进行命令的不同转化 */
void feedAppendOnlyFile(struct redisCommand *cmd, int dictid, robj **argv, int argc) {
    // 其实就是创建一个长度为0的空字符串
    sds buf = sdsempty();
    robj *tmpargv[3];

    /* The DB this command was targeting is not the same as the last command
     * we appendend. To issue a SELECT command is needed. */
    // 如果当前命令涉及的数据库与server.aof_selected_db指明的数据库不一致,需要加入SELECT命令显式设置
    if (dictid != server.aof_selected_db) {
        char seldb[64];

        snprintf(seldb,sizeof(seldb),"%d",dictid);
        buf = sdscatprintf(buf,"*2\r\n$6\r\nSELECT\r\n$%lu\r\n%s\r\n",
            (unsigned long)strlen(seldb),seldb);
        server.aof_selected_db = dictid;
    }
    // 将过期等的命令都转化为PEXPIREAT命令,把时间转化为了绝对时间
    if (cmd->proc == expireCommand || cmd->proc == pexpireCommand ||
        cmd->proc == expireatCommand) {
        /* Translate EXPIRE/PEXPIRE/EXPIREAT into PEXPIREAT */
        buf = catAppendOnlyExpireAtCommand(buf,cmd,argv[1],argv[2]);
    } else if (cmd->proc == setexCommand || cmd->proc == psetexCommand) {
        /* Translate SETEX/PSETEX to SET and PEXPIREAT */
        tmpargv[0] = createStringObject("SET",3);
        tmpargv[1] = argv[1];
        tmpargv[2] = argv[3];
        // 根据输入的字符串,进行参数包装,再次输出
        buf = catAppendOnlyGenericCommand(buf,3,tmpargv);
        decrRefCount(tmpargv[0]);
        buf = catAppendOnlyExpireAtCommand(buf,cmd,argv[1],argv[2]);
    } else {
        /* All the other commands don't need translation or need the
         * same translation already operated in the command vector
         * for the replication itself. */
        buf = catAppendOnlyGenericCommand(buf,argc,argv);
    }

    /* Append to the AOF buffer. This will be flushed on disk just before
     * of re-entering the event loop, so before the client will get a
     * positive reply about the operation performed. */
     // 将重构后的命令字符串追加到AOF缓冲区中。AOF缓冲区中的数据会在重新进入事件循环前写入磁盘中,相应的客户端也会受到一个关于此次操作的回复消息
    if (server.aof_state == REDIS_AOF_ON)
        server.aof_buf = sdscatlen(server.aof_buf,buf,sdslen(buf));

    /* If a background append only file rewriting is in progress we want to
     * accumulate the differences between the child DB and the current one
     * in a buffer, so that when the child process will do its work we
     * can append the differences to the new append only file. */
    // 如果后台正在执行AOF文件重写操作(即BGREWRITEAOF命令),为了记录当前正在重写的AOF文件和当前数据库的
    // 差异信息,我们还需要将重构后的命令追加到AOF重写缓存中。
    if (server.aof_child_pid != -1) // AOF重是通过派生子进程完成的,后面会介绍到
        aofRewriteBufferAppend((unsigned char*)buf,sdslen(buf));
    // 释放临时缓冲区的空间
    sdsfree(buf);
}
2.3 文件写入与同步

我们知道当用户调用write函数将一些数据写入到文件的时候,操作系统通常会将写入数据暂时保存在一个内存缓冲区里面,等到缓冲区的空间被填满,或者超过了指定的时限,或者内核需要重用缓冲区存放其它磁盘块数据时,才会真正将缓冲区中的所有数据写入到磁盘里面,这种方式称为延迟写。

这种做法虽然提高了效率,但也为写入数据带来了安全问题,如果计算机停机,则保存在缓冲区中的写入数据将丢失。为了保持一致性,即向文件写入数据立即真正的写入到磁盘上的文件中,而不是先写到内存缓冲区里面,则我们需要采取文件同步。

Redis服务器的进程本身就是一个事件循环,这个循环中的文件事件,负责接收客户端的命令请求和回复客户端,因此在每个事件过程中,Redis服务器都有可能执行写命令,因此在结束一个事件循环之前,Redis都会调用flushAppendOnlyFile将缓冲区的aof_buf的内容写入文件里面
每次redis进入event循环准备执行这个event时,会调用beforeSleep方法

void aeMain(aeEventLoop *eventLoop) {
    eventLoop->stop = 0;
    while (!eventLoop->stop) {
        if (eventLoop->beforesleep != NULL)
            eventLoop->beforesleep(eventLoop);
        aeProcessEvents(eventLoop, AE_ALL_EVENTS);
    }
}

/* This function gets called every time Redis is entering the
 * main loop of the event driven library, that is, before to sleep
 * for ready file descriptors. */
void beforeSleep(struct aeEventLoop *eventLoop) {
    ......
    /* Write the AOF buffer on disk */
    flushAppendOnlyFile(0);
    ......
}

Redis可以通过配置redis.conf文件中的flush选项来指定AOF同步策略,主要支持以下三种同步策略:
aof_fsync == AOF_FSYNC_EVERYSEC 每秒同步一次

aof_fsync == AOF_FSYNC_ALWAYS 每次事件循环写操作后都执行同步

aof_fsync == AOF_FSYNC_NO 不同步,让操作系统来决定何时同步

AOF_FSYNC_ALWAYS
表示每次事件循环后将aof_buf缓冲区内容写入文件,并且都要执行同步操作,所以效率相比其他两者是最低的,但是从数据的安全角度来说,是最安全的,即使出现故障停机,持久化过程最多也只会丢失一个事件循环中产生的数据

AOF_FSYNC_EVERYSEC
表示每次事件循环后将aof_buf缓冲区内容写入文件,并且每隔一秒再进行文件同步,这个同步操作的过程是在子线程中完成的,出现故障停机,可能会丢失一秒钟内产生的数据

AOF_FSYNC_NO
表示每次事件循环后将aof_buf缓冲区内容写入文件,至于何时将数据从内核缓冲区刷新到磁盘,由操作系统决定,安全性最差

/* 刷新缓存区的内容到磁盘中 */
void flushAppendOnlyFile(int force) {
    ssize_t nwritten;
    int sync_in_progress = 0;
    mstime_t latency;
    // 如果缓冲区没有数据,则无需写入同步
    if (sdslen(server.aof_buf) == 0) return;
    // 如果当前的同步模式为AOF_FSYNC_EVERYSEC;即每秒同步一次
    if (server.aof_fsync == AOF_FSYNC_EVERYSEC)
        // 获取当前正在等待的同步任务个数
        sync_in_progress = bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC) != 0;
    // 如果当前的同步模式为AOF_FSYNC_EVERYSEC;且是非强制的
    if (server.aof_fsync == AOF_FSYNC_EVERYSEC && !force) {
        /* With this append fsync policy we do background fsyncing.
         * If the fsync is still in progress we can try to delay
         * the write for a couple of seconds. */
        if (sync_in_progress) {
            // 如果本身aof_flush_postponed_start还是0,表明上次fsync还没有完成,所以我们这次延迟一下本次write,fsync
            if (server.aof_flush_postponed_start == 0) {
                /* No previous write postponinig, remember that we are
                 * postponing the flush and return. */
                server.aof_flush_postponed_start = server.unixtime;
                return;
            // 如果上次的fsync延迟时间小于2,继续延迟
            } else if (server.unixtime - server.aof_flush_postponed_start < 2) {
                /* We were already waiting for fsync to finish, but for less
                 * than two seconds this is still ok. Postpone again. */
                return;
            }
            /* Otherwise fall trough, and go write since we can't wait
             * over two seconds. */
            // 以上两种情况都不满足,则执行真正的同步,延迟的同步计数器加一
            server.aof_delayed_fsync++;
            redisLog(REDIS_NOTICE,"Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.");
        }
    }
    /* We want to perform a single write. This should be guaranteed atomic
     * at least if the filesystem we are writing is a real physical one.
     * While this will save us against the server being killed I don't think
     * there is much to do about the whole server stopping for power problems
     * or alike */

    // 在进行写入操作的时候,还监听了延迟,Redis对中很多简单的资源进行延迟采样监听,比如I/O磁盘操作,执行一些指令,
    latencyStartMonitor(latency);
    nwritten = write(server.aof_fd,server.aof_buf,sdslen(server.aof_buf));
    latencyEndMonitor(latency);
    /* We want to capture different events for delayed writes:
     * when the delay happens with a pending fsync, or with a saving child
     * active, and when the above two conditions are missing.
     * We also use an additional event name to save all samples which is
     * useful for graphing / monitoring purposes. */
     // 记录相关的延迟采样
    if (sync_in_progress) {
        latencyAddSampleIfNeeded("aof-write-pending-fsync",latency);
    } else if (server.aof_child_pid != -1 || server.rdb_child_pid != -1) {
        latencyAddSampleIfNeeded("aof-write-active-child",latency);
    } else {
        latencyAddSampleIfNeeded("aof-write-alone",latency);
    }
    latencyAddSampleIfNeeded("aof-write",latency);

    /* We performed the write so reset the postponed flush sentinel to zero. */
    server.aof_flush_postponed_start = 0;
    // 如果写入的数据总长度不是所期望的,也就是出现了错误,以下操作就是记录错误日志和恢复处理
    if (nwritten != (signed)sdslen(server.aof_buf)) {
        static time_t last_write_error_log = 0;
        int can_log = 0;

        /* Limit logging rate to 1 line per AOF_WRITE_LOG_ERROR_RATE seconds. */
        if ((server.unixtime - last_write_error_log) > AOF_WRITE_LOG_ERROR_RATE) {
            can_log = 1;
            last_write_error_log = server.unixtime;
        }

        /* Lof the AOF write error and record the error code. */
        if (nwritten == -1) {
            if (can_log) {
                redisLog(REDIS_WARNING,"Error writing to the AOF file: %s",
                    strerror(errno));
                server.aof_last_write_errno = errno;
            }
        } else {
            if (can_log) {
                redisLog(REDIS_WARNING,"Short write while writing to "
                                       "the AOF file: (nwritten=%lld, "
                                       "expected=%lld)",
                                       (long long)nwritten,
                                       (long long)sdslen(server.aof_buf));
            }

            if (ftruncate(server.aof_fd, server.aof_current_size) == -1) {
                if (can_log) {
                    redisLog(REDIS_WARNING, "Could not remove short write "
                             "from the append-only file.  Redis may refuse "
                             "to load the AOF the next time it starts.  "
                             "ftruncate: %s", strerror(errno));
                }
            } else {
                /* If the ftrunacate() succeeded we can set nwritten to
                 * -1 since there is no longer partial data into the AOF. */
                nwritten = -1;
            }
            server.aof_last_write_errno = ENOSPC;
        }

        /* Handle the AOF write error. */
        // 如果是AOF_FSYNC_ALWAYS模式下出错,直接退出进程,交给用户处理
        if (server.aof_fsync == AOF_FSYNC_ALWAYS) {
            /* We can't recover when the fsync policy is ALWAYS since the
             * reply for the client is already in the output buffers, and we
             * have the contract with the user that on acknowledged write data
             * is synched on disk. */
            redisLog(REDIS_WARNING,"Can't recover from AOF write error when the AOF fsync policy is 'always'. Exiting...");
            exit(1);
        } else {
            /* Recover from failed write leaving data into the buffer. However
             * set an error to stop accepting writes as long as the error
             * condition is not cleared. */
            server.aof_last_write_status = REDIS_ERR;

            /* Trim the sds buffer if there was a partial write, and there
             * was no way to undo it with ftruncate(2). */
            // 更新aof_buf,使用原来aof_buf从nwritten开始的字节内容替换aof_buf
            if (nwritten > 0) {
                server.aof_current_size += nwritten;
                sdsrange(server.aof_buf,nwritten,-1);
            }
            return; /* We'll try again on the next call... */
        }
    } else {
        // 没有出错,记录日志,状态
        /* Successful write(2). If AOF was in error state, restore the
         * OK state and log the event. */
        if (server.aof_last_write_status == REDIS_ERR) {
            redisLog(REDIS_WARNING,
                "AOF write error looks solved, Redis can write again.");
            server.aof_last_write_status = REDIS_OK;
        }
    }
    // 表示缓冲区已写入,无可写字节
    server.aof_current_size += nwritten;

    /* Re-use AOF buffer when it is small enough. The maximum comes from the
     * arena size of 4k minus some overhead (but is otherwise arbitrary). */
    if ((sdslen(server.aof_buf)+sdsavail(server.aof_buf)) < 4000) {
        sdsclear(server.aof_buf);
    } else {
        sdsfree(server.aof_buf);
        server.aof_buf = sdsempty();
    }

    /* Don't fsync if no-appendfsync-on-rewrite is set to yes and there are
     * children doing I/O in the background. */
    if (server.aof_no_fsync_on_rewrite &&
        (server.aof_child_pid != -1 || server.rdb_child_pid != -1))
            return;

    /* Perform the fsync if needed. */
    if (server.aof_fsync == AOF_FSYNC_ALWAYS) {
        /* aof_fsync is defined as fdatasync() for Linux in order to avoid
         * flushing metadata. */
        latencyStartMonitor(latency);
        // 如果采用AOF_FSYNC_ALWAYS的配置,则调用系统的fdatasync函数进行同步
        aof_fsync(server.aof_fd); /* Let's try to get this data on the disk */
        latencyEndMonitor(latency);
        latencyAddSampleIfNeeded("aof-fsync-always",latency);
        server.aof_last_fsync = server.unixtime;
    } else if ((server.aof_fsync == AOF_FSYNC_EVERYSEC &&
                server.unixtime > server.aof_last_fsync)) {
        // 如果采用 AOF_FSYNC_EVERYSEC配置,则使用后台线程每隔1秒进行同步操作,最终调用的还是Linux系统的fsync
        if (!sync_in_progress) aof_background_fsync(server.aof_fd);
        server.aof_last_fsync = server.unixtime;
    }
}
三、AOF文件持久化的过程梳理

经过以上分析,我们大致对AOF文件的持久化操作有了一定的了解,下面再来总结和梳理一下整个过程:
首先,redis的main函数最后会调用一个事件循环处理函数:

/* ae事件执行主程序 */
void aeMain(aeEventLoop *eventLoop) {
    eventLoop->stop = 0;
    //如果eventLoop中的stop标志位不为1,就循环处理
    while (!eventLoop->stop) {
        //每次eventLoop事件执行完后又重新开始执行时调用
        if (eventLoop->beforesleep != NULL)
            eventLoop->beforesleep(eventLoop);
        //while循环处理所有的evetLoop的事件
        aeProcessEvents(eventLoop, AE_ALL_EVENTS);
    }
}

aeProcessEvents 之后的调用过程:

aeProcessEvents —>readQueryFromClient—>processInputBuffer—>processCommand—>call—>propagate—>feedAppendOnlyFile(cmd,dbid,argv,argc)将数据写入缓冲区aof_buf

aeProcessEvents 处理事件结束后,会执行beforesleep函数

beforesleep函数的调用过程:

void beforeSleep(struct aeEventLoop *eventLoop) {
    .......
    /* Write the AOF buffer on disk */
    flushAppendOnlyFile(0);
}

flushAppendOnlyFile函数就是我们在第二节中分析的aof_buf的写入和同步实现了

到此AOF的持久化机制介绍到这里

问题:如果一直这样AOF下去,把所有客户端命令都重放到AOF文件内,势必导致AOF文件非常大,不断增大,而且可能会有很多重复的无用命令,这种情况我们如何解决呢?下篇博文中继续学习关于AOF文件的重写机制,redis使用AOF文件重写机制来解决这种限制

全网最全医学图像数据汇总 本仓库汇总了多个领域的医学图像开源数据集,涵盖CT、MRI、超声、内窥镜、病理、多模态、PET、OCT以及皮肤镜等多种成像技术。每个数据集均详细列出了任务类型、部位、格式、数量及下载链接,旨在为医学图像研究者提供便捷的资源导航。⚠️:这些数据集仅适用于学术研究用途。 阅读详情

相关推荐

【传奇开心果系列】Flet框架实现的窗口屏幕居中示例自定义模板特色和实现原理深度分析

本文介绍了使用Flet框架实现窗口屏幕居中的方法。通过设置page.window.center()方法,程序会自动计算屏幕尺寸和窗口位置实现居中显示。文章建议将任务栏设为自动隐藏以获得更精确的居中效果,并详细分析了Flet窗口管理的实现原理,包括坐标计算、跨平台兼容性等技术细节。该方案提供了简洁的API调用,支持动态调整窗口位置和多显示器环境,源码可通过优快云下载。

jackchuanqi的博客 1201

Redis AOF持久化原理解析

Redis版本:Redis 4.0.1 Redis是一个键值对数据库服务器,存储在内存中,如果重启没进行持久化,数据会丢失。所以需要持久化策略RDB和AOF。 涉及Redis源码解析:https://gitee.com/lidishan/redis-source-code-analysis/blob/master/src/aof.c AOF与RDB的区别 - AOF保存Redis所执行的写命令来记录数据库状态,RDB是直接保存键值对数据 - AOF纯文本,RDB二进制 ...

Lisam Blog 921

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 298

Redis的持久化方式

把内存中的数据持久化到磁盘中,防止数据丢失。—当redis服务器开启时,会把磁盘中的数据加载到内存中进行计算。

每日一记,每周一结。 1394

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 356

1.2 机器人控制系统软硬件平台

工业机器人的软硬件平台架构是影响工业机器人性能和效率的重要因素。良好的软硬件平台架构可以帮助工业机器人更加稳定和高效地完成工作,提高生产效率。正确的软硬件配置还可以提高工业机器人的灵活性和可靠性,使其能够更好地适应不断变化的生产环境。 同时,工业机器人的软硬件平台架构还可以影响工业机器人的安全性和维护成本。如果软硬件平台架构不合适,工业机器人可能出现故障或安全隐患,需要大量的维护和维修费用。因此,选择适当的软硬件平台架构对于确保工业机器人的高效运行和长期使用是非常重要的。

Galaxy_Robot的博客 2万+

AOF - Redis 设计与实现

AOF Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。 server [label = "命令请求"]; server -> aof [ label = "网络协议格

@农夫(Ben.Liang) 2572

基于业务目标的Agent自动化评测体系设计:超越准确率的有效性衡量

我们还是以电商全链路服务Agent我们还是以电商全链路服务Agent。

AI架构全栈开发实战笔记 318

Redis的AOF持久化深入解析

Redis提供两种持久化方式,RDB和AOF;与RDB不同,AOF可以完整的记录整个数据库,而不像RDB只是数据库某一时刻的快照; 那么AOF模式为什么可以完整的记录整个数据库呢? 原理:在AOF模式下,Redis会把执行过的每一条更新命令记录下来,保存到AOF文件中;当Redis需要恢复数据库数据时,只需要从之前保存的AOF文件中依次读取命令,执行即可 eg. Shell代码  我们执行了以下命...

qq_35181209的博客 4592

Yocto开发讲解系列 - 总目录

Yocto开发讲解系列总纲Yocto开发专栏前言

fulinux的博客 3万+

SAP ERP 系统订单行项目中的计划行(Scheduled Line)详解

*计划行(Scheduled Line)**是SAP系统中订单行项目(如采购订单、生产订单、销售订单等)的细分单元,用于记录和管理物料的供应或需求计划。每个订单行项目可以包含一个或多个计划行,每个计划行对应具体的交货日期、数量、需求类型(如采购申请、生产订单、库存调拨等)以及相关的物流控制参数。简单来说,计划行是系统对某一物料在特定时间点的供需状态的详细规划,它将订单分解为更细粒度的执行步骤,确保供应链各环节(如采购、生产、仓储)能够按计划协同工作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3391

redis持久化之AOF

号外号外,新建Redis交流讨论群:332160890,欢迎加入!! 一、说明 1.1AOF相关配置项 配置项 作用 aof_rewrite_perc 百分比阈值,当aof的增量超过这个阈值时,开始aof的rewrite操作 aof_rewrite_min_size 当aof的文件大小超过该值时

fusan2004的博客 790

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

银行信息系统应用架构详解 883

都2024年了还不明白Redis持久化?RDB文件、AOF文件、AOF重写

Redis本身是一个基于内存的数据库,它提供了RDB持久化、AOF持久化两种方式,用来将存储在内存中的数据库状态保存到磁盘中。前者是保存了整个Redis。AOF文件是AOF持久化的产物,AOF持久化通过保存服务器所有执行的写命令来记录数据库状态。对于一个键值对,AOF旧的文件会保存数十条对该键值对的修改命令,这样浪费了大量内存空间。现有的AOF文件,新旧两个AOF文件所保存的数据库状态相同,但新AOF文件。到新AOF文件的末尾,从而保证两个新旧AOF文件状态一致。的冗余命令,使得新的AOF文件体积很小。

程序员-杨胡广的博客 3805

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Redis持久化之AOF文件

上篇博客中,我们介绍了RDB文件,RDB文件是保存了整个数据库中的键值对状态,这势必会导致文件每次SAVE或BGSAVE时,都会产生一次较大的RDB文件,因此Redis还提供了另外一种持久化方案,即AOF文件,通过保存Redis服务器所执行的写命令来记录数据库状态。 一、AOF持久化的实现 AOF持久化主要包括三个步骤:命令追加、文件写入、文件同步 1.1 命令追加 当AOF持久化功能打开时,服务器在执行一个写命令后,会议协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾; 1.2 文件写

郑小小小小源的博客 643

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Redis持久化-AOF文件重写

Redis持久化-AOF文件重写

m0_61787196的博客 539

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis 中的 持久化 AOF持久化 打开AOF持久化功能 设置AOF文件的冲洗频率 AOF重写 AOF持久化的优缺点

这里写目录标题15.2 AOF持久化15.2.1 打开AOF持久化功能15.2.2 设置AOF文件的冲洗频率15.2.3 AOF重写1.BGREWRITEAOF命令其他信息2.AOF重写配置选项15.2.4 AOF持久化的优缺点参考目录 15.2 AOF持久化         与全量式的RDB持久化功能不同,AOF提供的是增量式的持久化功能, 这种持久化的核心原理在于:服务器每次执行完写命令之后,都会以协议文本的方式将被执行的命

norang的博客 728

Redis 的持久化机制和AOF文件重写原理

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。最后祝愿各位身体健康,顺利拿到心仪的offer!由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**

2401_83916204的博客 1099

Windows环境Redis使用AOF持久化,无法生成AOF文件,生成后无法加载AOF文件内容

windows 环境下使用 redis 解决AOF持久化机制问题,包括无法生成AOF文件及其启动redis无法加载AOF文件的问题 执行完成上述命令后,确实生成了AOF的持久化文件 , 如下图 但是采用这种方式生成的AOF文件,是无法正常使用的,当我们向Redis中存入内容,再杀掉Redis进程,重新获取刚存入的 key 会得到 null 值,所以采用这种方式是不完全正确的 Redis使用AOF的正确打开方式 我们不应该 文件打开Redis服务应该...

六六的小帅的博客 1334

Redis持久化之AOF找不到appendonly.aof文件

在redis中,AOF持久化会默认在/usr/local/bin/ 目录下生成名字为appendonly.aof的持久化文件,AOF模式是默认不开启的。需要手动修改redis.conf 配置文件 。将appendonly配置项的值修改为yes才能开启。开启之后必须重启reids-server服务器。如果使用的是redis7以及以上版本,在bin目录下我们找不到appendonly.aof文件。这是因为在redis7中关于AOF持久化有一个更新操作。AOF持久化不再是以单独的文件存在,而是生成一个append

S903784597的博客 5103

redis持久化 、 RDB 快照存储、 AOF 只追加文件

文章目录持久化 、 RDB 快照存储、 AOF 只追加文件RDB 快照存储AOF 只追加文件如何选择持久化 持久化 、 RDB 快照存储、 AOF 只追加文件 redis可以将数据写入到磁盘中,在停机或宕机后,再次启动redis时,将磁盘中的备份数据加载到内存中恢复使用。这是redis的持久化。持久化有如下两种机制。 RDB 快照存储 redis可以将内存中的数据写入...

bear_dada的博客 395

redis持久化方式以及AOF持久化文件过大重写

redis持久化方式 RDB方式 在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) RDB优点: 1.RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。 ​ 2.RDB 非常适用于灾难恢复(disaster re

木棉脚的博客 736

redis持久化文件+持久化机制(rdb和aof)+aof重写机制+redis4.0后混合持久化机制

本文将学习redis持久化文件和持久化机制(RDB、AOF) 一.redis持久化文件 redis持久化文件默认为dump.rdb和appendonly.aof,默认都在./目录下,这两个在redis.conf配置文件中有定义: # rdb持久化文件名 dbfilename dump.rdb # 工作目录。持久化文件会生成到这个目录下,可以修改为固定地址 dir ./ #是否开启aof,默认不开启 appendonly no #aof持久化文件名,默认不开启aof也不会生成aof文件 app

qq_20395245的博客 1122

Redis持久化中RDB和AOF文件出现不一致时,Redis是如何处理的?

AOF 优先:Redis 会优先使用 AOF 文件来恢复数据,因为它提供了更高的数据完整性。RDB 作为备选:如果 AOF 文件不可用或损坏,Redis 会尝试使用 RDB 文件来恢复数据。一致性保障:通过这种方式,Redis 可以在一定程度上确保数据的一致性和完整性。为了更好地管理和维护持久化文件,建议定期备份 RDB 和 AOF 文件,并监控它们的状态。此外,还可以考虑使用 Redis Sentinel 或 Redis Cluster 来进一步提高系统的高可用性和数据可靠性。

qq_33240556的博客 645

redis 持久化策略、aof配置、测试、手动持久化、aof文件体积优化

redis持久化策略 1、数据文件.rdb 2、更新日志.aof 设置aof 1、命令方式config set appendonly noconfig rewrite2、配置文件方式 redis持久化机制 当满足持久化策略时,做rdb的持久化 当不满足持久化策略时,以aof日志的方式保存下来。当服务器重启时,加载rdb和aof做并集处理。aof效率高,因为它只是文...

atu99602的博客 175

Redis持久化(五)-AOF文件的载入与数据还原、AOF文件重写实现原理

AOF文件的载入与数据还原AOF文件的载入与数据还原AOF文件重写实现原理AOF后台重写(BGREWRITEAOF命令实现原理)触发AOF后台重写的条件(重要!!!) AOF文件的载入与数据还原 因为AOF文件里面包含了重建数据库状态所需的所有写命令,所以服务器只要读入并重新执行一遍AOF文件里面保存的写命令,就可以还原服务器关闭之前的数据库状态 Redis读取AOF文件并还原数据库状态的详细步骤如下: 创建一个不带网络连接的伪客户端(fake client):因为Redis的命令只能在客户端上下文中执行

星光之子的博客 1585
上一篇: Redis之RDB持久化
下一篇: App虚拟化技术初探
code&poetry
博客等级 码龄14年 134粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值