源码分析redis7的aof new feature AOF时间戳

本文深入分析Redis7中AOF的新特性——AOF时间戳。详细解读了时间戳生成的源码流程,并通过添加日志级别验证了猜想。在主从同步和工具如Redis Shake的使用中,时间戳功能不会造成影响。
摘要由CSDN通过智能技术生成

源码分析redis7的aof new feature AOF时间戳

首先,redis所有对于aof的具体实现代码在aof.c这个文件里
时间戳的生成是下方这段代码

/* Generate a piece of timestamp annotation for AOF if current record timestamp
 * in AOF is not equal server unix time. If we specify 'force' argument to 1,
 * we would generate one without check, currently, it is useful in AOF rewriting
 * child process which always needs to record one timestamp at the beginning of
 * rewriting AOF.
 *
 * Timestamp annotation format is "#TS:${timestamp}\r\n". "TS" is short of
 * timestamp and this method could save extra bytes in AOF. */
sds genAofTimestampAnnotationIfNeeded(int force) {
   
    sds ts = NULL;
    // 正常写aof的过程 先命令 --> 执行 --> buffer  --> sync 到 append only file 
    // 这里正常写aof的过程,注意这里是aof 到buffer 而不是走sync到aof的file 
    // 所以呢?与appendonlyfile的参数是 always everysec no 这几个值一点关系都没有
    
    
    // ts默认为NULL
    // 举例 set a 1 ,在命令执行之后,写入buf之前 带着 genAofTimestampAnnotationIfNeeded(0)来访问
    // 此时下面的逻辑要看 server.aof_cur_timestamp < server.unixtime
    // 2022 15:31:31.033 * 陈同学代码测试,此处的时间戳是#TS:1648539091 --> 2022-03-29 15:31:31
    // server.unixtime这个值一秒get一次新的值 有其他的代码更新
    // 所以只有在一个新的1s的时候,才会返回时间戳 

    // rewrite的话是默认走 1 默认拿时间戳

    if (force || server.aof_cur_timestamp < server.unixtime) {
   
        server.aof_cur_timestamp = force ? time(NULL) : server.unixtime;  // -->force为真取得 NULL 为假取得 时间戳
        ts = sdscatfmt(sdsempty(), "#TS:%I\r\n", server.aof_cur_timestamp);
        serverAssert(sdslen(ts) <= AOF_ANNOTATION_LINE_MAX_LEN);
    }
    // serverLog(LL_NOTICE,"陈同学代码测试,此处的时间戳是%s Unix标准时间%s",ts,sdacatfmt(ts));
    serverLog(LL_NOTICE,"陈同学代码测试,此处的时间戳是%s",ts);
    // serverLog(LL_NOTICE,"Unix time 是 %s",server.unixtime); server.unixtime 不能直接打印,他是1s更新一次,这样写会导致Crash
    return ts;
}

大体的流程我已经写到这里面了,函数上方是作者的备注,可以读一下
为了验证猜想,我做了个骚操作,并重新编译了Redis代码
我把Get时间戳的方法给他加了个LL_NOTICE级别的日志,该级别日志会打印到redis的log中
通过看log

40093:M 29 Mar 2022 16:05:33.407 * 陈同学代码测试,此处的时间戳是#TS:1648541133

40093:M 29 Mar 2022 16:05:33.566 * 陈同学代码测试,此处的时间戳是(null)
40093:M 29 Mar 2022 16:05:33.722 * 陈同学代码测试,此处的时间戳是(null)
40093:M 29 Mar 2022 16:05:33.877 * 陈同学代码测试,此处的时间戳是(null)
40093:M 29 Mar 2022 16:05:34.298 * 陈同学代码测试,此处的时间戳是#TS:1648541134

40093:M 29 Mar 2022 16:05:34.459 * 陈同学代码测试,此处的时间戳是(null
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值