零,起因
我为什么要造redis这个轮子?
1,破除对redis神秘感。
2,“基础服务中台”的同事们在开会讨论redis云,以及redis代理。
3,开一个redis资源并不是容易事,为什么不可以不可以写成java直接推送到未来云上,简单方便。
以这个思路我开始使用业余时间研究了redis的tcp通讯原理与redis命令,出发点是写一个redis云代理之类的云管理软件,但是还是忍不住写成了java版的redis,本文章主要分享redis的编写心路历程。
复制代码
一,redis通讯与Netty
1,tcp
连到Redis服务器的客户端建立了一个到6379端口的TCP连接。
虽然RESP在技术上不特定于TCP,但是在Redis的上下文中,该协议仅用于TCP连接(或类似的面向流的连接,如unix套接字)。
使用netty作为通讯框架。
2,协议
Redis客户端和服务器端通信使用名为 RESP (REdis Serialization Protocol) 的协议。虽然这个协议是专门为Redis设计的,它也可以用在其它 client-server 通信模式的软件上。 RESP 协议在Redis1.2被引入,直到Redis2.0才成为和Redis服务器通信的标准。这个协议需要在你的Redis客户端实现。
RESP 是一个支持多种数据类型的序列化协议:简单字符串(Simple Strings),错误( Errors),整型( Integers), 大容量字符串(Bulk Strings)和数组(Arrays)。
RESP在Redis中作为一个请求-响应协议以如下方式使用:
客户端以大容量字符串RESP数组的方式发送命令给服务器端。 服务器端根据命令的具体实现返回某一种RESP数据类型。 在 RESP 中,数据的类型依赖于首字节:
单行字符串(Simple Strings): 响应的首字节是 "+" 错误(Errors): 响应的首字节是 "-" 整型(Integers): 响应的首字节是 ":" 多行字符串(Bulk Strings): 响应的首字节是"$" 数组(Arrays): 响应的首字节是 "*" 另外,RESP可以使用大容量字符串或者数组类型的特殊变量表示空值,下面会具体解释。RESP协议的不同部分总是以 "\r\n" (CRLF) 结束。 字符串 "foobar" 编码如下:
"$6\r\nfoobar\r\n"
复制代码
实际redis命令是什么样的,比如 SET lhjljh lhjkjhkh
*3\r\n$3\r\nSET\r\n$6\r\nlhjljh\r\n$8\r\nlhjkjhkh
复制代码