如何用rust为redis写一个client
最近nosql变得非常流行,redis作为其中的佼佼者,基本也是大部分程序员必备的技能了。我们知道,redis是一个key-value数据库,它运行在内存中但是可以持久化到内存。我们一般很熟悉redis的那些基本命令,但是如何使用某种语言来操作redis呢?那些常用的语言一般都有相应的驱动,但是像rust这样的新语言呢?
Redis Protocol
Redis是通过RESP(REdis Serialization Protocol)来沟通Sever和Client的。这种协议是专门为Redis设计的,它有以下几种特点:
- 实现非常简单
- 解析非常快
- 很容易被人所理解
RESP采用了TCP来通信。一个redis-client通过创建一个到6379端口的TCP连接来和redis-server通信。并且它采用的是Request-Response模型,即每次一个command发送给服务端后,服务端都会返回一个应答给客户端。
RESP协议的语法非常简单,主要就分成以下几种:
- Simple Strings: 第一个字节是"+" 比如
+OK\r\n
- Errors: 第一个字节是"-" 比如
-Error message\r\n
- Integers: 第一个字节是":",比如
:1000\r\n
- Bulk Strings: 第一个字节是"$",后跟一个数字,表示String 的长度,后面再跟字符串。比如字符串xyz,就应该是
$3\r\nxyz\r\n
- Arrays: 第一个字节是"*":*后面跟数组元素个数,再后面跟相应的元素,例如
*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
Redis-rust-simple
到目前为止,实际上我们思路已经很清晰了:
- 建立TCP连接
- 生成相应的command并发送
- 接受server发来的reply,并解析
建立连接
这样我们首先创建一个Client结构体
pub struct RedisClient {
io: TcpStream
}
第一步需要建立连接