上一篇写的Godis版本号:v0.0.2上一篇实现了client/server交互。本文主要介绍get/set命令的实现。命令本身比较简单,但是支持命令的整个系统基础比较麻烦。本文将介绍get/set操作涉及的组件和模块,适当简化,最终实现功能。Redis是用C语言编写的。C语言本身不支持复杂的数据结构,所以Redis中的string、list、set等结构都是Redis自己实现的;Godis的Go版本将尝试使用原生数据结构。原理介绍set命令和get命令是Redis中使用频率最高的命令。以set为例,“setkeyvalue”命令将键值对存储在Redis服务器中,可以简化为“操作远程关联数组”。当然,相对于关联数组,Redis有以下特点:多DB,支持数据库切换;高可用数据持久化;高可用性主从复制;security,transactions,publishandsubscribe等。本文重点介绍数据在内存中的存储和查询,交互协议和持久化会在后续的小文中实现。执行流程拆解从服务端初始化,客户端输入“setalpha123”命令,到收到返回结果,经过以下步骤:实例化服务端及相关资源,准备连接;client与server建立连接,server初始化一个client结构保存当前连接;将客户端请求的“setalpha123”字符串拆分为“set”、“alpha”、“123”三部分;查看是否支持set命令,判断参数是否合法,调用set命令的实现函数SetCommand,更新db数据;执行结果响应客户端;执行过程大致如下:下面分别对主要步骤进行说明。1、数据交互第一部分实现的client/server交互使用的协议是textproto,并没有使用Redis本身的统一协议。在这篇文章中,客户端对服务端执行的get和set命令都是以原生文本的形式发送给服务端执行的。读者在阅读实现代码时,还可以看到最新的发布版本。在godis-cli.go文件中与v0.0.1有一个diff://清除回车和换行//text=strings.Replace(text,"\n","",-1)这一行是暂时注释掉,即在v0.0.2版本中,使用“n”作为文本协议分隔符来判断命令结束。例如客户端发送“setalpha123”,服务端收到如下字节数据:对应的ASCII码为:2.服务端准备第一篇文章(https://segmentfault.com/a/11...)提到服务器需要一个服务器结构来存储相关信息。在服务器准备好处理请求之前,实例化结构体并进行一系列的初始化操作:初始化基本配置,分配多个db资源,加载磁盘持久化数据,信号监听处理等。初始化服务器的代码主要是一些赋值操作和相应的结构初始化://初始化服务器实例funcinitServer(){godis.Pid=os.Getpid()godis.DbNum=16initDb()godis.Start=time.Now().UnixNano()/1000000//vargetfserver.CmdFungetCommand:=&core.GodisCommand{Name:"get",Proc:core.GetCommand}setCommand:=&core.GodisCommand{Name:"set",Proc:core.SetCommand}godis.Commands=map[string]*core.GodisCommand{"get":getCommand,"set":setCommand,}}//初始化dbfuncinitDb(){godis.Db=make([]*core.GodisDb,godis.DbNum)fori:=0;我
