GO实现Redis持久化
项目开发到这里,我们的下一步就是实现Redis的持久化落盘功能,Redis是一个内存型的数据库,在之前我们实现的单机版Redis如果把进程杀掉,我们通过GET、SET指令存储的数据都将不复存在,数据只存在内存的map里面,重启之后什么都没有了
我们现在的目标就是把用户发来的指令以resp协议的形式记录在aof文件中,这个aof文件是落在我们电脑硬盘里的,所以是持久化的,当我们Redis内存停掉之后,这个文件会保留下来,当Redis在重启时,我们再读取文件里的数据,把用户之前的指令重新读取出来,再执行一遍,这样就简单的实现了Redis的持久化
实现落盘准备工作
aof.go
我们创建一个aof文件并新建aof.go,我们需要一个AofHandler数据结构,这个Handler是用来处理aof文件的处理器,他可以写和读aof文件,他要持有的数据有Database,这个Database里有Redis核心,还要持有aof文件、用户现在选择的DB分数据库和aof写文件缓存区的channel
type AofHandler struct {
database databaseface.Database
aofChan chan *payload
aofFile *os.File
aofFilename string
currentDB int
}
然后我们还要写一下channel里面传输数据的数据类型写一下,他的字段有用户指令和分DB所引
type CmdLine = [][]byte
type payload struct {
cmdLine CmdLine
dbIndex int
}
aof处理器的数据结构我们就设计完了,然后就是设计aof处理器的行为,首先是NewAofHandler,然后就是Add功能,他的功能就是把用户的指令包装成payload塞到aofChan这个channel里面去,接下来是落盘功能HandleAof,他的逻辑是把缓冲区里的数据取出来放到硬盘里去,最后是加载功能LoadAof,就是在初始化重启的时候把我们之前落在磁盘里用户的指令加载出来,接下来我们就开始实现这几个方法
首先是NewAofHandler,他的实现逻辑首先是读取aof文件名,给database赋值,然后是打开aof文件,如果没有这个文件我们创建文件,如果有这个文件我们打开这个文件,将文件填充到aofFile字段,理论上我们的AofHandler初始化过程就已经完成了,但目前还缺两个细节,一个是在初始化AofHandler的时候是系统刚刚启动的时候,我们要把之前写在硬盘里的aof文件加载恢复,另一个是对channel的操作,我们后面补文章来源:https://www.toymoban.com/news/detail-621983.html
func NewAofHandler(database databaseface.Database) (*AofHandler, error) {
handler := &AofHandler{}
handler.aofFilename = config.Properties.AppendFilename
handler.database = database
//Load
aofile, err := os.OpenFile(handler.aofFilename, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0600)
if err != nil {
return nil, err
}
handler.aofFile = aofile
//channel
return handler, nil
}
然后是Add功能,他的函数入参有分数据库DB所引和具体指令,业务逻辑就是新建payload并把函数入参组装成payload塞到channel里面文章来源地址https://www.toymoban.com/news/detail-621983.html
到了这里,关于Go重写Redis中间件 - Go实现Redis持久化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!