redis的底层通讯原理
下面手动写一个简单的redis客户端:
public class RedisClient {
Socket socket = null;
public RedisClient() throws IOException{
socket = new Socket("127.0.0.1",6379);
}
//发送一条命令 set name ccx-rw
public void set(String key,String value) throws IOException {
//redis请求数据包格式(针对redis的resp协议,大家可以看redis的官方文档:https://redis.io/topics/protocol)
/**
* <number of arguments>CRLF 参数数量
* $<number of bytes of argument 1>CRLF 第一个参数的长度
* <argument data> CRLF 第一个参数的的值
.....
* $<number of bytes of argument 1>CRLF 第n个参数的长度
* <argument data> CRLF 第n个参数的的值
*/
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("*3").append("\r\n");//参数数量
//第一个参数
stringBuffer.append("$").append("SET".getBytes().length).append("\r\n");
stringBuffer.append("SET").append("\r\n");
//第二个参数
stringBuffer.append("$").append(key.getBytes().length).append("\r\n");
stringBuffer.append(key).append("\r\n");
//第三个参数
stringBuffer.append("$").append(value.getBytes().length).append("\r\n");
stringBuffer.append(value).append("\r\n");
//把命令发给redis服务器
socket.getOutputStream().write(stringBuffer.toString().getBytes());
//读数据
byte[] response = new byte[1024];
socket.getInputStream().read(response);
System.out.println(new String(response));//返回+OK
}
public static void main(String[] args) throws IOException {
new RedisClient().set("name","ccx-rw");
}
}
然后通过get就能拿到redis里面的数据。