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) 
posted @ 2024-09-27 17:15  董少奇  阅读(12)  评论(0)    收藏  举报