源码分析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