一直對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()