redis 持久化rdb文件控制每次最大写入参数是什么?

redis bgsave fork 子程序给临时文件写数据的时候,最大写入多少MB?

比如我10G内存数据,他不会一次性往里面写10G把我IO都占满吧?

请问有没有控制这个最大写入值的参数?

阅读 2.2k
2 个回答
/* The following functions are our interface with the stream. They'll call the
 * actual implementation of read / write / tell, and will update the checksum
 * if needed. */
/* rio的写方法 */
static inline size_t rioWrite(rio *r, const void *buf, size_t len) {
    while (len) {
        //判断当前操作字节长度是否超过最大长度
        size_t bytes_to_write = (r->max_processing_chunk && r->max_processing_chunk < len) ? r->max_processing_chunk : len;
        //写入新的数据时,更新校验和
        if (r->update_cksum) r->update_cksum(r,buf,bytes_to_write);
        //执行写方法
        if (r->write(r,buf,bytes_to_write) == 0)
            return 0;
        buf = (char*)buf + bytes_to_write;
        len -= bytes_to_write;
        //操作字节数增加
        r->processed_bytes += bytes_to_write;
    }
    return 1;
}

/* rio的读方法 */
static inline size_t rioRead(rio *r, void *buf, size_t len) {
    while (len) {
        //判断当前操作字节长度是否超过最大长度
        size_t bytes_to_read = (r->max_processing_chunk && r->max_processing_chunk < len) ? r->max_processing_chunk : len;
        //读数据方法
        if (r->read(r,buf,bytes_to_read) == 0)
            return 0;
        //读数据时,更新校验和
        if (r->update_cksum) r->update_cksum(r,buf,bytes_to_read);
        buf = (char*)buf + bytes_to_read;
        len -= bytes_to_read;
        r->processed_bytes += bytes_to_read;
    }
    return 1;
}

通过 fork 创建子进程时不会立刻触发大量内存的拷贝,内存在被修改时会以页为单位进行拷贝。

并没有参数可以控制这个,有系统直接调度写入。
而且写的时候也不是说10GB内存就写了10GB啊,你看过rdb文件格式解析吧,所以,他fork出内存后,还要把他转成rdb的格式写入。
与其担心写入太快,把磁盘IO占满,要不要换上SSD 阵列
如果还是担心,那么你Redis 主从,主节点关闭rdb和aof, 从节点开启rdb 就好了。这个从节点可以不承担业务,随便他写。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进