当前位置: 首页 > 后端技术 > PHP

使用Go实现Redis的准备工作之一

时间:2023-03-30 03:54:52 PHP

起源公司第一个PHP-to-GO项目,在生产环境稳定运行数周,需求量不大。最近有空分享一下去年学习GO过程中的收获。动手项目Godis——用Golang实现的Redis.Redis3.0版本,代码简洁精炼,是Web后端程序员使用最多的组件之一。熟悉Redis原理,阅读多篇源码的开发者大有人在。本系列小文不会过多介绍Redis的细节。但是,在需要系统说明的地方,我们还是会尝试在更大的空间里进行解??读。进入正题的基本流程。Godis第一个版本的目标是“最基本的kv缓存”。特性列表如下:client/server交互set/get命令实现AOF持久化。.实际工作中按照编码流程,先设计基本架构再填写实现方法,Godis的架构图一步到位,无需修饰:原理分析1.Client/Server交互Client和Server建立网络连接并发送、处理、返回数据给对方,完成通信。在Redis的单机应用中,一个服务器端的redis-server进程可以处理来自多个客户端的请求。客户端需要一个数据结构来保存信息、接收命令、与服务器保持连接、与服务器进行一对一的交互。客户需要的具体信息暂不罗列。服务器端为了响应多个客户端的请求,还需要一个结构体来存储基本信息,包括数据本身、正在连接的客户端等,以实现对数据的查询、存储、更新、删除等操作。通过这两个基本数据结构,客户端和服务端可以在建立连接后保存自己和对方的必要信息(可以简化为一个socketdemo),维护后续的交互。从原理分析开始,使用下图所示的结构可以满足存储客户端和服务端的数据存储需求:客户端并不是我们用来与redis-server交互的客户端,而是在与redis-server建立连接后redis-server,服务器在服务器上创建一个结构体来存储当前的连接。Redis-server并不关心与redis-server建立连接的客户端,毕竟它交互的只是协议。如图所示,client和server结构体都有Db字段。不同的是server.Db指向的是0号db(Redis支持多db,可以自己查);client.Db指向正在连接的数据库。如果有select切换操作,指向也会随之改变。2、set/get命令实现set和get命令是redis最常用的命令之一,也是最能体现缓存发展历史的操作。通过阅读最简单的命令代码,您可以了解Redis的核心原理。set命令将数据库中的数据保存为k-v键值对,即redis-server占用的内存,任何连接到Redis服务器的客户端都可以通过get命令进行查询。上一节提到,保存服务器相关信息需要一个结构体,set命令保存的数据也存在于这个结构体中。但是,存储的是指向数据的指针。因此,set/get的实现原理可以简化为将set命令的数据保存在服务器数据结构中,执行get命令时从该数据结构中查找。客户端接收到set和get命令后,通过协议转换传递给服务端执行。服务器在执行命令之前,会检查是否支持该命令,以决定是否执行该命令。因此,server结构体还需要一个commands字段来记录支持的命令列表。3、AOF持久化实现set命令保存的数据不能一直保存在内存中。万一宕机或硬件故障,数据会烟消云散?这就需要持久化技术,这也是存储领域的一个关键技术。AOF是AppendOnlyFile的缩写,代表“只增”的持久化方式。在Godisv1.0版本中,AOF持久化会以最简单的方式实现,这样下次开机就能找到上次设置的数据:)持久化不应该对所有命令一视同仁,减少不必要的执行开销。在服务端添加一个dirty字段来标记数据是否被污染,然后决定是否持久化。数据结构关联上面已经介绍过了,这里再来一张Godisv1.0版本的数据结构图:下集预告完成服务端/客户端交互