使用Go从零实现一个Redis(五):实现AOF持久化和AOF重写

您所在的位置:网站首页 redis写入文件方式 使用Go从零实现一个Redis(五):实现AOF持久化和AOF重写

使用Go从零实现一个Redis(五):实现AOF持久化和AOF重写

2023-05-08 07:51| 来源: 网络整理| 查看: 265

传送门:使用Go从零实现一个Redis(四):实现pubsub发布订阅命令

代码地址:JaricY/miniRedis (github.com)

此代码参考了大佬的godis。godis是一个非常值得学习的项目!!!

大佬的博客 :Finley (cnblogs.com)

大佬的源码 :github.com/hdt3213/god…

什么是AOF持久化

Redis的AOF(Append-Only File) 是一种持久化机制,用于在Redis服务器运行期间记录所有写操作。

AOF文件是一个追加文件,其中包含Redis服务器执行的所有写操作。

与传统的快照持久化方式不同,AOF将每个写命令追加到文件中,从而可以完整地恢复数据,即使Redis在写命令执行之间崩溃,也可以保证数据不会丢失。

使用AOF持久化机制可以提供更好的数据持久化和可靠性,但需要更多的磁盘空间和写入磁盘的操作,可能会对Redis的性能产生一定的影响。

具体来说,AOF文件包含以下内容:

Redis的命令(包括参数),以文本格式保存在文件中。这些命令可以是写命令(如SET、INCR等)或删除命令(如DEL)。

Redis事务的命令,以MULTI、EXEC、DISCARD、WATCH等命令的形式保存在文件中。

AOF文件还包含一些特殊的命令,用于处理服务器状态的持久化,如BGREWRITEAOF、SELECT、FLUSHALL等。

需要注意的是,AOF文件包含的是Redis执行的所有写操作,而不是所有的操作。例如,如果使用READONLY命令来设置Redis为只读模式,那么这个命令不会被记录在AOF文件中。此外,AOF文件中的命令顺序与它们执行的顺序相同,这保证了数据的一致性和可靠性。

根据不同的业务场景,Redis提供了三种不同的持久化方式。

每秒钟同步(Every Second):这种方式是默认的AOF持久化方式。Redis每隔一秒钟将AOF缓冲区中的所有写命令同步到磁盘上的AOF文件中。这种方式可以提供很好的持久化能力,同时也保证了较高的性能。

每个写命令同步(Every Write):这种方式是将每个写命令都同步到磁盘上的AOF文件中。虽然这种方式可以提供最强的持久化能力,但是由于需要频繁地进行磁盘写入操作,所以会对性能产生很大的影响,不建议在高负载环境下使用。

不同步(No):这种方式是不对AOF文件进行持久化。即使在Redis进程退出或崩溃时,也不会对AOF文件进行任何操作。这种方式的优点是对性能影响最小,缺点是在发生故障时可能会丢失数据,不建议在生产环境中使用。

需要注意的是,如果你希望在Redis进程退出或崩溃时能够快速地恢复数据,建议将AOF持久化方式设置为每秒钟同步或每个写命令同步。这样可以保证在发生故障时不会丢失太多的数据。同时,你也可以通过使用Redis提供的备份和恢复工具来创建备份文件,以进一步增强数据的可靠性和安全性。

什么是AOF重写

随着Redis服务器运行时间的增长,AOF文件会变得越来越大,这会导致AOF文件的读写操作变慢,并占用更多的磁盘空间。

AOF重写可以通过创建一个新的AOF文件来解决这个问题,该文件包含与原始AOF文件相同的数据,但是经过了一定的优化,可以显著减小AOF文件的大小,并提高读写性能。

进行AOF重写有几个主要的原因: 减少AOF文件的大小:随着Redis服务器运行时间的增长,AOF文件会不断变大,这会导致AOF文件的读写操作变慢,并且占用更多的磁盘空间。通过进行AOF重写,可以创建一个更小、更紧凑的AOF文件,从而减少磁盘空间的使用和读写操作的延迟。 优化AOF文件的读写性能:AOF重写可以通过去除不必要的命令,从而减少Redis服务器在AOF文件中的读写操作。这将导致更快的写入速度和更快的AOF文件重放,从而提高Redis服务器的整体性能。 消除AOF文件中的错误或不一致的数据:AOF重写将创建一个新的AOF文件,其中只包含能够完全重现当前数据库状态的命令。这意味着所有已过时或无效的命令都将被删除,从而消除AOF文件中的任何错误或不一致的数据。

需要注意的是,AOF重写是一个耗时的操作,需要一定的时间和资源。在进行AOF重写之前,应该仔细考虑AOF文件的大小、Redis服务器的性能需求以及重写操作的影响。通常情况下,建议在闲置时间进行AOF重写操作,并且定期进行AOF重写,以保持Redis服务器的最佳性能。

提问:如果在进行AOF重写的时候,有写操作执行,那么该怎么记录?

在进行AOF重写期间,如果有新的写操作执行,Redis会将这些操作同时写入旧的AOF文件和内存中的数据库。这是因为Redis不希望在AOF重写期间丢失任何数据。

当AOF重写完成后,Redis会将新的AOF文件加载到内存中,并用新的AOF文件覆盖旧的AOF文件。这时,Redis会根据新的AOF文件重新构建数据库,并忽略旧的AOF文件中的写操作。

需要注意的是,重写期间的写操作会导致新的AOF文件与旧的AOF文件之间存在一些不一致的地方,这可能会影响AOF文件的正确性和可靠性。为了解决这个问题,Redis在重写期间使用了一个机制,称为AOF重写缓冲区(AOF Rewrite Buffer),用于缓存重写期间的写操作。这样,即使在重写期间有新的写操作发生,也不会影响重写操作的正确性。

AOF重写缓冲区是Redis在进行AOF重写期间使用的一种机制,它的作用是缓存重写期间的写操作,以避免重写期间的写操作丢失或对AOF文件的正确性产生影响。

AOF重写缓冲区可以看作是一个暂存区,Redis将在AOF重写期间发生的所有写操作都缓存在这个区域中。具体来说,当Redis在重写AOF文件时,它会同时将新的写操作写入旧的AOF文件和AOF重写缓冲区中。这样一来,即使在重写期间有新的写操作发生,也不会影响重写操作的正确性。

当AOF重写完成后,Redis会将AOF重写缓冲区中缓存的所有写操作一次性写入新的AOF文件中,从而保证新的AOF文件包含了所有的写操作。然后,Redis会将新的AOF文件加载到内存中,并用新的AOF文件覆盖旧的AOF文件。

通过使用AOF重写缓冲区,Redis可以确保在AOF重写期间不会丢失任何数据,并保证新的AOF文件包含了所有的写操作。同时,AOF重写缓冲区还可以减少重写操作对性能的影响,因为Redis可以将写操作缓存在内存中,而不是直接写入磁盘,从而提高重写操作的速度。

golang_tutorial_coverage.jpg

实现AOF持久化 定义执行结构体

定义一个用于执行AOF持久化操作的执行者,执行者主要包括以下的属性:

ctx 用于持久化的协程的上下文 db 数据库引擎,表示需要执行的数据库所具备的方法 aofFileName aofFile AOF文件名称和文件 aofFsync 写入策略 pausingAof锁,用于暂停AOF持久化 currentDb 当前正在执行持久化的数据库编号 具体包括AOF重写的完整结构体如下(aof/aof.go): type Persister struct { // 用于执行持久化的执行者 ctx context.Context //持久化协程的上下文 cancel context.CancelFunc // 持久化协程的取消函数 db database.DBEngine // 数据库引擎 tmpDBMaker func() database.DBEngine // 临时的数据库创建函数,用于AOF重写的时候创建临时数据库 aofChan chan *payload // 用于在持久化协程和Redis主协程之间传递任务的通道,一般用于在AOF重写的时候作为临时的重写缓冲区 aofFile *os.File // AOF文件。 aofFilename string // AOF名。 aofFsync string // AOF写入策略(always/everysec/no) // 当aof任务完成并准备关闭时,aof goroutine将通过此通道向main goroutine发送消息。 aofFinished chan struct{} // 持久化协程完成后通知Redis主协程的通道 pausingAof sync.Mutex // 锁,用于在AOF重写期间暂停AOF持久化 currentDB int // 当前正在使用的数据库编号 listeners map[Listener]struct{} // Redis事件监听器 // reuse cmdLine buffer buffer []CmdLine // 命令缓冲区 } 复制代码 执行AOF持久化操作

执行AOF持久化操作:

开启listenCmd方法并开始监听命令 利用管道实现协程之间的通信传递命令 当有一个命令需要被写入到AOF文件的时候,执行SaveCmdLine方法,传递进入当前的数据库以及命令内容 listenCmd()监听命令 (aof/aof.go) func (persister *Persister) listenCmd() { // 监听命令 for p := range persister.aofChan { persister.writeAof(p) } persister.aofFinished


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3