视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Redis协议是什么样的
2020-11-09 06:57:41 责编:小采
文档


前言

我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。

redis协议

解析数据的过程主要依赖于redis的协议了。 我们写个简单例子看下redis的协议:

public class RedisTest {
 public static void main(String[] args) {
 Jedis jedis = new Jedis("127.0.0.1", 6379);
 jedis.set("eat", "I want to eat");
 }
}

监听socket:

 public static void main(String[] args) throws IOException {
 ServerSocket server = new ServerSocket(6379);
 Socket socket = server.accept();
 byte[] chars = new byte[];
 socket.getInputStream().read(chars);
 System.out.println(new String(chars));
 }

看下数据:

*3
$3
SET
$3
eat
$13
I want to eat

参照官方协议文档https://redis.io/topics/protocol,解析下数据。

(1)简单字符串 Simple Strings, 以 "+"加号 开头 (2)错误 Errors, 以"-"减号 开头 (3)整数型 Integer, 以 ":" 冒号开头 (4)大字符串类型 Bulk Strings, 以 "$"美元符号开头,长度512M (5)组类型 Arrays,以 "*"星号开头 并且,协议的每部分都是以 "\r\n" (CRLF) 结尾的。

所以上面的数据的含义是:

*3 数组包含3个元素,分别是SET、eat、I want to eat
$3 是一个字符串,且字符串长度为3
SET 字符串的内容
$3 是一个字符串,且字符串长度为3
eat 字符串的内容
$13 是一个字符串,且字符串长度为13
I want to eat 字符串的内容

执行get 'eat'的数据如下:

*2
$3
GET
$3
eat

撸一个客户端

掌握了redis协议,socket之后,我们就可以尝试撸一个客户端了。

socket:

public RedisClient(String host, int port){
 try {
 this.socket = new Socket(host,port);
 this.outputStream = this.socket.getOutputStream();
 this.inputStream = this.socket.getInputStream();
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }

set协议:

 public String set(final String key, String value) {
 StringBuilder sb = new StringBuilder();
 //虽然
输出的时候,会被转义,然而我们传送的时候还是要带上\r\n sb.append("*3").append("\r\n"); sb.append("$3").append("\r\n"); sb.append("SET").append("\r\n"); sb.append("$").append(key.length()).append("\r\n"); sb.append(key).append("\r\n"); sb.append("$").append(value.length()).append("\r\n"); sb.append(value).append("\r\n"); byte[] bytes= new byte[1024]; try { outputStream.write(sb.toString().getBytes()); inputStream.read(bytes); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return new String(bytes); }

测试:

 RedisClient redisClient = new RedisClient("127.0.0.1", 6379);
 String result = redisClient.set("eat", "please eat");
 System.out.println(result);

执行结果:

+OK

更多Redis相关技术文章,请访问Redis教程栏目进行学习!

下载本文
显示全文
专题