Redis连接池Jedis动手解析(Resp协议)

本文参考自 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协议的详细内容

你可能感兴趣的:(Redis,缓存)