当前位置: 首页 > news >正文

Go重写Redis中间件 - Go实现Redis持久化

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.DatabaseaofChan     chan *payloadaofFile     *os.FileaofFilename stringcurrentDB   int
}

然后我们还要写一下channel里面传输数据的数据类型写一下,他的字段有用户指令和分DB所引

type CmdLine = [][]bytetype payload struct {cmdLine CmdLinedbIndex int
}

aof处理器的数据结构我们就设计完了,然后就是设计aof处理器的行为,首先是NewAofHandler,然后就是Add功能,他的功能就是把用户的指令包装成payload塞到aofChan这个channel里面去,接下来是落盘功能HandleAof,他的逻辑是把缓冲区里的数据取出来放到硬盘里去,最后是加载功能LoadAof,就是在初始化重启的时候把我们之前落在磁盘里用户的指令加载出来,接下来我们就开始实现这几个方法

首先是NewAofHandler,他的实现逻辑首先是读取aof文件名,给database赋值,然后是打开aof文件,如果没有这个文件我们创建文件,如果有这个文件我们打开这个文件,将文件填充到aofFile字段,理论上我们的AofHandler初始化过程就已经完成了,但目前还缺两个细节,一个是在初始化AofHandler的时候是系统刚刚启动的时候,我们要把之前写在硬盘里的aof文件加载恢复,另一个是对channel的操作,我们后面补

func NewAofHandler(database databaseface.Database) (*AofHandler, error) {handler := &AofHandler{}handler.aofFilename = config.Properties.AppendFilenamehandler.database = database//Loadaofile, err := os.OpenFile(handler.aofFilename, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0600)if err != nil {return nil, err}handler.aofFile = aofile//channelreturn handler, nil
}

然后是Add功能,他的函数入参有分数据库DB所引和具体指令,业务逻辑就是新建payload并把函数入参组装成payload塞到channel里面

http://www.lryc.cn/news/111831.html

相关文章:

  • 单元测试之 - Review一个微服务的单元测试
  • NetSuite 2023.2 Cash 360 功能更新
  • vue2-组件和插件的区别
  • neo4j查询语言Cypher详解(一)--语法和子句
  • PCIe总线详解
  • 【vim 学习系列文章 4 - vim与系统剪切板之间的交互】
  • 代码随想录算法训练营第五十六天| 583. 两个字符串的删除操作 72. 编辑距离
  • Mac强制停止应用
  • Linux系统Redis的哨兵架构配置
  • HarmonyOS/OpenHarmony-ArkTS基于API9元服务开发快速入门
  • macbook怎么卸载软件?2023年最新全新解析macbook电脑怎样删除软件
  • c51单片机16个按键密码锁源代码(富proteus电路图)
  • GraalVM
  • File 类和 InputStream, OutputStream 的用法总结
  • 开源进展 | WeBASE v3.1.0发布,新增多个实用特性
  • C++动态加载 插件
  • redis的缓存更新策略
  • Android应用开发(6)TextView进阶用法
  • Matlab滤波、频谱分析
  • 车载软件架构 —— 车载软件入侵检测系统
  • “深入解析JVM内部机制:理解Java虚拟机的工作原理“
  • FPGA初步学习之串口发送模块【单字节和字符串的发送】
  • Kotlin重点理解安全性
  • 基于Java+SpringBoot+SpringCloud+Vue的智慧养老平台设计与实现(源码+LW+部署文档等)
  • Spring中的全局异常处理
  • 【安全测试】Web应用安全之XSS跨站脚本攻击漏洞
  • LeNet卷积神经网络-笔记
  • 使用XMLHttpRequest实现文件异步下载
  • Lombok 的安装与使用
  • springBean生命周期解析