手把手教你编写入门级redis客户端

作者: 阿里云云栖号 | 来源:发表于2017-12-04 16:54 被阅读650次

    摘要:既然Redis客户端已经这么丰富了,为什么还要尝试自己编写客户端?我的看法是,知己知彼,自己尝试制作Redis客户端,不仅可以加深对Redis的了解,而且可以通晓Redis客户端的原理,为今后的更好地使用、乃至定制改造Redis作好充分准备。

    Redis是开源的、基于内存的数据结构存储系统,可用作数据库、缓存以及消息代理方面。Redis支持许多种数据结构,并内置了丰富的诸如冗余、脚本、事务、持久化等功能,深受业界喜爱,被各种业务系统广泛使用。为了方便使用,Redis官网推荐了针对各种编程语言的多种客户端,支持java、c#、python、c++等主流编程语言。那么大家会问,既然Redis客户端已经这么丰富了,为什么还要尝试自己编写客户端?我的看法是,知己知彼,自己尝试制作Redis客户端,不仅可以加深对Redis的了解,而且可以通晓Redis客户端的原理,为今后的更好地使用、乃至定制改造Redis作好充分准备。

    知识准备

    要想亲自开发Redis客户端,需要以下知识:

    1、网络编程基础

    2、熟悉Redis协议

    3、了解Redis的基本操作

    另外文中的例子将会采用java编写,因此最好有基本的java编程知识。

    面向读者

    本文面向Redis各层次使用者。

    Redis Protocal

    Redis协议被称为:RESP (REdis Serialization Protocol),客户端通过TCP协议连接到客户端的6379端口(默认端口)。

    RESP协议是在Redis1.2中引入的,不过现在已经是Redis2.0中的标准协议了。所以你应该再Redis客户端中实现这个协议。

    RESP描述

    RESP其实是一个序列化协议,支持简单字符串、错误、整数、整块字符串和数组。数据类型依赖头文字,分别表示如下:

    简单字符串的头文字是“+”

    错误的头文字是“-”

    整数的头文字是“:”

    整块字符串的头文字是“$”

    数组的头文字是“*”

    RESP在请求-响应模型中的用法

    -客户端向Redis服务器发送命令,命令的格式是仅以RESP整块字符串构成的数组。。

    -服务器端根据命令的结果,选择适宜的一种RESP类型返回

    简单字符串

    简单字符串是以半角加号开头,后跟随着不含回车换行的字符串,然后以回车换行结尾。

    举例如下:+OKrn

    简单字符串是非二进制安全的,如果需要二进制安全,可使用“整块字符串”。

    错误

    错误和简单字符串类似,但头文字换成半角减号了。后面跟随的文字,可以视为错误消息内容。

    举例如下:

    -ERR unknown command 'foobar'

    -WRONGTYPE Operation against a key holding the wrong kind of value

    整数

    整数与简单字符串类似,头文字为半角冒号。

    举例如下:

    :0rn

    :1000rn

    整块字符串

    整块字符串可以用来标示二进制安全的、最大512MB长度的字符串。它以$符号开头,后跟随实际字符串长度,以回车换行结尾,后跟随实际字符串,再最终以回车换行结尾。

    举例如下:

    $6rnfoobarrn

    空字符串表现形式如下:$0rnrn

    nil表现形式如下:$-1rnrn

    数组

    数组以半角星号开头,后接数组中元素个数,然后以回车换行结尾,然后后接各个元素。

    举例如下:

    空数组:*0rn

    包含两个整块字符串的数组:*2rn$3\r\nfoo\r\n$3rnbarrn

    包含三个整数的数组:*3rn:1rn:2rn:3rn

    数组还支持嵌套。

    Redis客户端原理

    要实现和Redis服务端通信,首先需要与Redis服务端建立TCP通信连接,然后使用上述的RESP协议,将想要执行的Redis命令发送至服务端,并等待服务端响应,然后接收到响应结果,展示给用户。

    以下代码实现了一个简单的获取info的操作。

    运行后,系统将会在命令行界面输出info的执行结果。

    结尾

    根据上述代码所描述的方法,就可以继续扩展客户端的功能,实现Redis各种命令了。

    笔者实现

    源码请参考

    https://github.com/yourcaptain/dudu-RESP_intepreter

    maven中央仓库###:

    maven中央仓库地址

    https://oss.sonatype.org/#nexus-search;classname~RESP

    相关文章

      网友评论

        本文标题:手把手教你编写入门级redis客户端

        本文链接:https://www.haomeiwen.com/subject/kuhxixtx.html