godis

Golang 实现 Redis(4): AOF 持久化与AOF重写

自闭症网瘾萝莉.ら 提交于 2020-04-09 12:19:21
本文是使用 golang 实现 redis 系列的第四篇文章,将介绍如何使用 golang 实现 Append Only File 持久化及 AOF 文件重写。 本文完整源代码在作者Github HDT3213/godis AOF 文件 AOF 持久化是典型的异步任务,主协程(goroutine) 可以使用 channel 将数据发送到异步协程由异步协程执行持久化操作。 在 DB 中定义相关字段: type DB struct { // 主线程使用此channel将要持久化的命令发送到异步协程 aofChan chan *reply.MultiBulkReply // append file 文件描述符 aofFile *os.File // append file 路径 aofFilename string // aof 重写需要的缓冲区,将在AOF重写一节详细介绍 aofRewriteChan chan *reply.MultiBulkReply // 在必要的时候使用此字段暂停持久化操作 pausingAof sync.RWMutex } 在进行持久化时需要注意两个细节: get 之类的读命令并不需要进行持久化 expire 命令要用等效的 expireat 命令替换。举例说明,10:00 执行 expire a 3600 表示键 a 在 11:00 过期,在 10:30