本文参考自 https://redis.io/topics/protocol
Redis可以当做JAVA中增强版HashMap, 一个K-V非关系型数据库
不同于Http大数据量, 使用RESP协议快速操作内存数据
Resp是做什么的
Redis协议规范, Redis客户端使用名为RESP(REdis序列化协议)的协议与Redis服务器通信。虽然该协议是专为Redis设计的,但它可以用于其他客户端 - 服务器软件项目。
如何使用
Redis-cli 设置k-v command : set key value
在resp协议中表示为 :
// \r\n 区分每一部分
// 提取即为 *3 $3 set ${0} {1} ${2} {3}
// * 开头标志元素 后面接语句元素数 set key value 有三部分, 所以为 *3
// $ 指定元素长度, $3 表示 随后元素长度为3 ($3 set)
// {0}{1}...{N}同, 这里用占位符替代
"*3\r\n$3\r\nset\r\n${0}\r\n{1}\r\n${2}\r\n{3}\r\n"
代码示例
package keith.demo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.text.MessageFormat;
/**
* @author cxf
* @create 2019-06-26 21:19
* @desc 动手实现redis连接
**/
public class KeithJedisResp {
InputStream is = null;
OutputStream os = null;
// 连接Redis, 进行通信
public KeithJedisResp(String host, int port) throws IOException {
Socket socket = new Socket(host, port);
is = socket.getInputStream();
os = socket.getOutputStream();
}
// 根据resp 进行 set 操作
public String set(String key, String value) throws IOException {
// set 模板
String setTemplate = "*3\r\n$3\r\nset\r\n${0}\r\n{1}\r\n${2}\r\n{3}\r\n";
os.write(MessageFormat.format(setTemplate, key.getBytes().length, key, value.getBytes().length, value).getBytes());
byte[] bytes = new byte[1024];
is.read(bytes);
return new String(bytes);
}
}
结果测试
public static void main(String[] args) throws IOException {
// 本机连接测试
KeithJedisResp keithJedisResp = new KeithJedisResp("127.0.0.1", 6379);
System.out.println(keithJedisResp.set("keith", "resp test"));
}
Console Result : +OK
扩展
想测试更多的小伙伴, 官网 https://redis.io/topics/protocol 提供了RESP协议的详细内容