redis源码之aof(十一)
简介
aof是redis数据持久化的一种方式,类似mysql的bin-log,就是将数据库的操作命令记录到文件,然后重启的时候从文件加载并执行命令就可以恢复数据库,特点是比rdb更少的数据丢失,保存的文件比rdb文件大,重启加载速度比rdb慢,更少的写磁盘。
配置
# 开启aof
appendonly yes
# aof文件名,放在dir配置的路径下
appendfilename "appendonly.aof"
# 每秒刷写一次server.aof_buf的数据到磁盘,可以保证故障的时候只有1秒的数据丢失
appendfsync everysec
# 当aof文件是上次rewrite操作产生的大小的2倍,就再次执行rewrite
auto-aof-rewrite-percentage 100
# 当rewrite的时候,先创建rdb,然后追加aof的方式追加命令,可以提高速度和减小文件大小
aof-use-rdb-preamble yes
源码
// 处理客户端网络包
void readQueryFromClient(connection *conn)
static int connSocketRead(connection *conn, void *buf, size_t buf_len)
void processInputBuffer(client *c)
// 从c->querybuf取一行数据,放入c->argv
int processInlineBuffer(client *c)
// 处理客户端命令
int processCommandAndResetClient(client *c)
// 进行一些检查后,执行命令
int processCommand(client *c)
// 调用命令处理函数c->cmd->proc
void call(client *c, int flags)
// 将命令写入到replication buff或者aof缓冲区
void propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,
int flags)
// 将命令写入server.aof_buf
void feedAppendOnlyFile(struct redisCommand *cmd, int dictid, robj **argv, int argc)
// 定时检查和写磁盘
int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData)
void flushAppendOnlyFile(int force)
// 调用系统调用write写磁盘
ssize_t aofWrite(int fd, const char *buf, size_t len)

浙公网安备 33010602011771号