REDIS (15)手写Java Redis客户端(1)RESP协议分析(未完)

6 篇文章 0 订阅

一直对Jedis有点兴趣, 现在静下心来抽空看看redis客户端和消费端是怎么连接的

1. 对Jedis的get命令抓包

发送
在这里插入图片描述
接收
在这里插入图片描述

可见是明文协议,0d 0a 是 \r\n我们找下文档
redis 序列化协议

2. 模仿协议内容发送并接收内容

2.1 JAVA传统BIO的写法

public static void main(String[] args) throws Exception {
	Socket socket = new Socket("123.56.78.70", 6379);
	OutputStream out = socket.getOutputStream();
	InputStream in = socket.getInputStream();

	StringBuilder sb = new StringBuilder();
	sb.append("*3").append("\r\n");
	sb.append("$3").append("\r\n");
	sb.append("SET").append("\r\n");
	sb.append("$3").append("\r\n");
	sb.append("mua").append("\r\n");
	sb.append("$4").append("\r\n");
	sb.append("lisa").append("\r\n");
	out.write(sb.toString().getBytes());

	byte[] bytes = new byte[1024];
	in.read(bytes);

	System.out.println(sb.toString());
	System.out.println("-----------------");
	System.out.println(new String(bytes));
	socket.close();
}

结果:

*3
$3
SET
$3
mua
$4
lisa

-----------------
+OK

2.2 python的写法

#!/usr/bin/python
# -*- coding: UTF-8 -*-
## 尝试连接 redis
import socket #导入socket模块

s = socket.socket()         #创建socket对象
host = socket.gethostname() #获取本地主机名
port = 6379                 #设置端口号

s.connect(("123.56.78.80",port))


##  1.标准输入输出
while(True):
    key = raw_input("plz input redis key:")
    strLen = len(key)
    strLenStr = str(strLen)
    print "your input:", key
    print "your len:", strLenStr

    # s.send('*3\r\n$3\r\nSET\r\n$3\r\nmua\r\n$4\r\nlisa\r\n')
    # print 'result:\n', s.recv(1024)
    cmd = '*2\r\n' + '$3\r\n'+'GET\r\n'+'$'+ strLenStr + '\r\n'+ key + '\r\n'

    s.send(cmd)
    result = s.recv(1024)
    print 'redis value result:\n', '\033[0;32m', result,'\033[0m', 
s.close()


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值