实现一个简单的redis-client

redis通信原理

    redis客户端与服务端之间使用tcp进行通信,redis客户端每执行一条命令,都会将命令封装成特定的格式传送到服务端,

如果我们需要实现redis客户端,就需要完成请求的封装。

   如果我们打开redis的aof文件,经常会看到类似于下面这样的内容,这实际上就是客户端发送给服务端的数据格式

 

   下面用java实现一个简单的拥有set、get方法的redis客户端,网络编程使用socket,具体代码如下所示:

public class RedisClient {

    private InputStream inputStream;

    private OutputStream outputStream;

    public RedisClient(String host, int port) throws IOException {
        Socket socket = new Socket(host, port);
        inputStream = socket.getInputStream();
        outputStream = socket.getOutputStream();
    }

    public String get(String key) throws IOException {
        byte[] result = new byte[1024];
        //封装数据
        StringBuilder data = new StringBuilder();

        //命令参数个数
        data.append("*2").append("\r\n");

        data.append("$3").append("\r\n");
        data.append("GET").append("\r\n");
        //key字节长度
        data.append("$").append(key.getBytes().length).append("\r\n");
        data.append(key).append("\r\n");

        outputStream.write(data.toString().getBytes());

        inputStream.read(result);


        String[] values = new String(result).split("\r\n");

        //redis无值返回"$-1"
        if ("$-1".equals(values[0])) {
            return null;
        }
        return values[1];

    }

    public void set(String key, String value) throws IOException {

        if (key == null || value == null) {
            return;
        }

        //封装数据
        StringBuilder data = new StringBuilder();
        //命令参数个数
        data.append("*3").append("\r\n");
        data.append("$3").append("\r\n");
        data.append("SET").append("\r\n");
        //key 字节长度
        data.append("$").append(key.getBytes().length).append("\r\n");
        data.append(key).append("\r\n");
        //value字节长度
        data.append("$").append(value.getBytes().length).append("\r\n");
        data.append(value).append("\r\n");

        System.out.println(data);
        //socket传递数据
        outputStream.write(data.toString().getBytes());

        //读取返回信息
        byte[] response = new byte[10];
        inputStream.read(response);
    }

    public static void main(String[] args) throws IOException {
        RedisClient redisClient = new RedisClient("127.0.0.1", 6379);

        redisClient.set("hello", "redis-client");

        System.out.println(String.format("get data from redis:%s", redisClient.get("hello")));
    }
}

  可以看到,这个简单的客户端可以正常的工作:

 

posted @ 2019-01-17 23:15  gluawwa  阅读(1039)  评论(0编辑  收藏  举报