Redis protocol (redis通信协议)

以前只会用redis -cli客户端, 或者在java程序里使用jedis来作为介质与redis服务器通信.这两天正好在实习中解除了一点这方面的内容. 五一放假就稍微翻了翻redis相关资料.

本篇博客一来是给自己整理笔记,二来是给学校的同学们分享: 面向于使用过redis, 但只是停留在基本set get的命令, 不了解其中原理的同学.

介绍redis的ping pong

首先介绍一下ping pong.. (有同学不懂..我就再加上ping pong的介绍吧)

登录redis cli客户端后, 输入ping, 服务器会返回pong, 来表示连接状况是完好的, 也表示了服务器大体上是正常运转的.

其中的第一行是我用docker 启动的客户端, 大家如果不是docker的话, 自己正常启动redis -cli就行..

ping之后就会收到pong

使用Java socket 来实现 Redis 的ping pong

抄代码的时候大家良心一点...不要去用我的ip去试...(非要拿我的试也没关系...因为我已经偷偷改掉一位数了)

public static void main(String[] args) throws Exception {
        // socket
        Socket socket = new Socket("140.143.135.210", 6379);

        // oi流
        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();

        // 向redis服务器写
        os.write("PING\r\n".getBytes());

        //从redis服务器读,到bytes中
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);

        // to string 输出一下
        System.out.println(new String(bytes,0,len));
    }

 返回的结果如下:

问: 为什么会有一个 '+'符号 呢?  redis -cli里是没有这个加号的呀?  答:这个和通信协议有关, 一会儿再介绍具体的含义. 不过redis -cli只是把这个'+'符号吞掉处理了, 没显示出来罢了. 如果这么说还不理解的话......看下面代码...

public static void main(String[] args) throws Exception {
        // socket
        Socket socket = new Socket("140.143.135.210", 6379);

        // oi流
        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();

        // 向redis服务器写
        os.write("PING\r\n".getBytes());

        //从redis服务器读,到bytes中
        byte[] bytes = new byte[1024];
        if(is.read()=='+'){
            // to string 输出一下
            int len = is.read(bytes);
            System.out.println(new String(bytes,0,len));
        }
        // else if $
        // else if *
        // else
    }

 这样就跟redis -cli里的一样啦.就只是pong了

 

ps: 不是我逗大家玩....jedis在在协议层也是类似于这样的写法, 把$ * + 这几个符号挨个判断来确定传输内容的含义的...

接下来咱们实现一下SET 和 GET 吧

猜你喜欢

转载自www.cnblogs.com/noKing/p/8973787.html
今日推荐