主体流程:
- 获取初始的字符串。
- 将字符串解析成合法的通信字符数组。
- 获取回复字符数组。
- 将字符数组解析成可读懂的字符串。
这是这个项目中最主要的流程。我们需要从这个流程中抽象出数据,将这个流程以面向对象的形式分解。
第一步的数据,原始的字符串如下:
set mykey myvalue
到第2步,该字符串已经被解析成如下的形态。
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n
我们可以直接在这两个字符串上做出一定程度的抽象,满足我们的要求吗?不行,因为这两个子字符串本身携带的信息太少了,虽然我们可以通过一定的手段,获取充足的其他数据,但是这一定的手段同样有着不小的消耗,并且这份消耗并不是一时的,而是会多次发生的。
这里我们需要注意的是,这个充足的其他数据是什么。整个参数的个数,每个参数的字节长度。这些是我们注意的,并且是需要的,所以我们需要这样一个结构,来保存这些信息。
当然,如果我们只是简单的完成原始字符串到通信字符串的转化是不需要考虑这些的。
这里我们获得了此程序中第一个数据—请求。
与此对应的我们可以获得另一数据—回复。
于是上述的流程我们改写成下面的形式。
好的,现在让我们思考—请求这一数据中应该包含什么?
请求:
- 整个参数的个数
- 每个参数的字符串
- 对应参数的字节长度
那么—回复这一数据应该包含什么?
在redis的通讯协议中,回复共分为五种:
- 状态回复
- 错误回复
- 整数回复
- 批量回复
- 多条批量回复
在回复中较为特殊的是多条批量回复,它是其他回复的一种嵌套。
我们知道了请求-回复的组成,现在需要的是将这些抽象成rust中数据结构。这个我们后面再谈。