Jedis原理简介

一、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命令,大家可以自己进行测试。

    原文作者:守住阳光
    原文地址: https://www.jianshu.com/p/fbaaf40d9eda
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞