一、Jedis介绍
Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对各类API进行封装调用。
二、Redis通信协议
Redis通信协议是Redis客户端与Redis之间交流的语言,通信协议规定了命令和返回值的格式。Redis支持两种通信协议,一种是二进制安全地统一请求协议另一种是比较直观的便于在telnet程序中输入的简单协议。这两种协议只是命令的格式有区别,命令返回值的格式是一样的。
(一)、简单协议
简单协议适合在telnet程序中与redis进行通信。简单协议的命令格式就是将命令和各个参数使用空格分隔开,如“EXISTS foo”、“SET foo bar”等。由于redis解析简单协议时只是简单地以空格分隔参数,所以无法输入二进制值。
(二)、统一请求协议
统一请求协议时从redis1.2开始加入的,其命令格式和多行字符串回复的格式很类似,如SET foo bar 的统一请求协议的写法是:*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\nbar\\r\n。如果开发redis客户端,推荐使用此协议。Jedis使用二进制安全地统一请求协议与redis进行通信。
三、模拟的jedis通信原理
废话不说,先上代码。
public class TSocketClient {
//定义socket
private Socket socket;
public TSocketClient(){
try {
socket = new Socket("127.0.0.1",6379);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String set(final String key , final String value) throws IOException{
StringBuilder sb = new StringBuilder();
sb.append("*3").append("\r\n");
sb.append("$3").append("\r\n");
sb.append("set").append("\r\n");
sb.append("$").append(key.getBytes().length).append("\r\n");
sb.append(key).append("\r\n");
sb.append("$").append(value.getBytes().length).append("\r\n");
sb.append(value).append("\r\n");
socket.getOutputStream().write(sb.toString().getBytes());
byte[] b = new byte[2048];
socket.getInputStream().read(b);
return new String(b);
}
public String get(final String key) throws IOException{
StringBuilder sb = new StringBuilder();
sb.append("*2").append("\r\n"); //*表示数组 后面数字表示数组长度
sb.append("$3").append("\r\n");
sb.append("get").append("\r\n");
sb.append("$").append(key.getBytes().length).append("\r\n"); //美元符号表示字符串,后面的数字表示长度
sb.append(key).append("\r\n");
socket.getOutputStream().write(sb.toString().getBytes());
byte[] b = new byte[2048];
socket.getInputStream().read(b);
return new String(b);
}
}
Jedis 客户端通过建立socket与redis进行通信。根据统一请求协议规则:*表示数组,后面的数字表示数组长度,$表示字符串,后面的数字表示字符串长度。所以set foo bar 按统一请求协议就是*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\nbar\r\n。redis客户端回复为OK。上面的代码实现了set命令和get命令,大家可以自己进行测试。