实现一个简单的redis-client

Posted gluawwa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现一个简单的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")));
    }
}

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

 

以上是关于实现一个简单的redis-client的主要内容,如果未能解决你的问题,请参考以下文章

golang代码片段(摘抄)

VsCode 代码片段-提升研发效率

IOS开发-OC学习-常用功能代码片段整理

简单的方法来分享/讨论/协作的代码片段?

为啥这段代码会泄露? (简单的代码片段)

创建自己的代码片段(CodeSnippet)