前言
JAVA开发人员出去面试,基本是必问Redis。
Redis分为客户端和服务端两个部分,这次就是通过手写一个Redis的客户端,让你掌握里面的知识。
RESP协议
RESP协议是Redis客户端和服务端之间的通讯协议,这是它的官方文档:https://redis.io/topics/protocol。
我就是根据这个协议来实现客户端的。
协议几个要点:
1、客户端和服务端通过TCP进行数据交互
2、 传输的数据遵循RESP协议,如下:
每一段数据通过 进行分隔,每段数据通过一个特殊标志作为开头
* 代表数组
$ 多行字符串
+ 单行信息
- 错误信息
: 整型数字
不能理解没关系,看完我的示例,你自己多练几把就明白了。
客户端步骤1 - 建立TCP连接
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/** 自己实现Redis客户端 */
public class RedisClient {
// 往外写数据
OutputStream outputStream;
// 读取服务端返回的数据
InputStream inputStream;
// 1、 客户端和服务端是通过tcp网络连接
public RedisClient(String host, int port) throws Exception {
// 建立 java客户端和Redis服务端的一个连接
Socket socket = new Socket(host, port);
// 往外写数据
outputStream = socket.getOutputStream();
// 读取服务端返回的数据
inputStream = socket.getInputStream();
}
}
客户端步骤2 - 实现set/get命令
// set key value
public void set(String key, String value) throws Exception {
// 1、 组装数据
StringBuffer data = new StringBuffer();
data.append("*3").append("\r\n");
data.append("$3").append("\r\n");
data.append("SET").append("\r\n");
data.append("$").append(key.getBytes().length).append("\r\n");
data.append(key).append("\r\n");
data.append("$").append(value.getBytes().length).append("\r\n");
data.append(value).append("\r\n");
// 2、 把指令数据发给Redis服务端
outputStream.write(data.toString().getBytes());
System.out.println("发送成功:");
System.out.println(data);
// 3、 接收服务端响应
byte[] response = new byte[1024];
inputStream.read(response);
System.out.println("接收到响应:" + new String(response));
}
客户端步骤3 - 测试
public static void main(String[] args) throws Exception {
RedisClient redisClient = new RedisClient("127.0.0.1", 6379);
redisClient.set("Hello", "Tony");
redisClient.get("Hello");
}
重要的是思路,希望对你有启发。
JAVA学习不易,不要好高骛远,需要沉下心系统性的学习。重要的是思路,希望对你有启发。