redis通信协议、简单客户端

1,Redis通信协议

1)基本特征
client与server使用tcp通信
不同数据类型根据请求/响应的第一个字节区分
字符串不能包含\r\n
2)RESP协议的5中数据类型
第一个字节 + 表示简单字符串 simple strings eg:"+OK\r\n"
第一个字节 - 表示信息errors eg: "-Error msg \r\n"
第一个字节:表示整数integers eg: ":100\r\n"
第一个字节$ 表示批量字符串bulk strings
第一个字节* 表示数组arrays

5148056-b4540fe076abbb50.png
image.png

3)redis发送命令的格式
命令本身也作为参数
每一段数据使用\r\n区分
以 * 数据表示开头
5148056-1595c2fad3d4d6ea.png
image.png

5148056-231d233c8cd7e3f7.png
image.png

4)redisClient例子
set命令
5148056-1240e7a80c77ce50.png
image.png

info命令
5148056-f33228f0db00c4c0.png
image.png

2,简单的redis客户端

5148056-b625b9f113259b80.png
image.png
package com.immomo.moaservice.live.roulette.impl.resource.delegate;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * Created by he.zhanqi on 2019/1/9.
 */
public class RedisCli {

  private static InputStream in;
  private static OutputStream out;

  public RedisCli(String host, int port) throws Exception{
    Socket socket = new Socket(host, port);
    in = socket.getInputStream();
    out = socket.getOutputStream();
  }

  public static String set(String key, String value) throws Exception{
    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");
    out.write(data.toString().getBytes());
    byte[] res = new byte[1024];
    in.read(res);
    return new String(res);
  }

  public static void main(String[] args) throws Exception{
    RedisCli redisCli = new RedisCli("127.0.0.1", 6379);
    System.out.println(set("hzqqq", "111"));
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_34293246/article/details/87444573
今日推荐