redis数据如何落盘_Redis基础—了解Redis是如何做数据持久化的

之前的文章介绍了Redis的简单数据结构的相关使用和底层原理,这篇文章我们就来聊一下Redis应该如何保证高可用。

数据持久化

我们知道虽然单机的Redis虽然性能十分的出色, 单机能够扛住10w的QPS,这是得益于其基于内存的快速读写操作,那如果某个时间Redis突然挂了怎么办?我们需要一种持久化的机制,来保存内存中的数据,否则数据就会直接丢失。

Redis有两种方式来实现数据的持久化,分别是RDB(Redis Database)和AOF(Append Only File),你可以先简单的把RDB理解为某个时刻的Redis内存中的数据快照,而AOF则是所有记录了所有修改内存数据的指令的集合(也就是Redis指令的集合),而这两种方式都会生成相应的文件落地到磁盘上,实现数据的持久化,方便下次恢复使用。

接下来就分别来聊聊这两种持久化方案。

RDB

在redis中生成RDB快照的方式有两种,一种是使用save,另一种是bgsave,但是底层实现上,其调用的是同一个函数,叫rdbsave,只是其调用的方式不同而已。

生成方法

save

save命令直接调用rdbsave方法,此时会阻塞Redis主进程,直至快照文件生成。

void saveCommand(client *c) {
     
    if (server.rdb_child_pid != -1) {
        addReplyError(c,"Background save already in progress");
        return;
    }
    rdbSaveInfo rsi, *rsiptr;
    rsiptr = rdbPopulateSaveInfo(&rsi);
    if (rdbSave(server.rdb_filename,rsiptr) == C_OK) {
        addReply(c,shared.ok);
    } else {
        addReply(c,shared.err);
    }
}
bgsave

bgsave命令会fork出一个子进程,由fork出来的子进程调用rdbsave。父进程会继续响应来自客户端的读写请求。子进程完成RDB文件生成之后会给父进程发送信号,通知父进程保存完成。

/* BGSAVE [SCHEDULE] */
void bgsaveCommand(client *c) {
    int schedule = 0;

    /* The SCHEDULE option changes the behavior of BGSAVE when an AOF rewrite
     * is in progress. Instead of returning an error a BGSAVE gets scheduled. */
    if (c->argc > 1) {
        if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"schedule")) {
            schedule = 1;
        } else {
            addReply(c,shared.syntaxerr);
            return;
        }
    }

    rdbSaveInfo rsi, *rsiptr;
    rsiptr = rdbPopulateSaveInfo(&rsi);

    if (server.rd
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值