zoukankan      html  css  js  c++  java
  • 实现一个简单的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("
    ");
    
            data.append("$3").append("
    ");
            data.append("GET").append("
    ");
            //key字节长度
            data.append("$").append(key.getBytes().length).append("
    ");
            data.append(key).append("
    ");
    
            outputStream.write(data.toString().getBytes());
    
            inputStream.read(result);
    
    
            String[] values = new String(result).split("
    ");
    
            //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("
    ");
            data.append("$3").append("
    ");
            data.append("SET").append("
    ");
            //key 字节长度
            data.append("$").append(key.getBytes().length).append("
    ");
            data.append(key).append("
    ");
            //value字节长度
            data.append("$").append(value.getBytes().length).append("
    ");
            data.append(value).append("
    ");
    
            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")));
        }
    }

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

     

  • 相关阅读:
    如何解决git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to '
    git
    pytest自动化测试执行环境切换
    JS实现菜单栏折叠
    vue-highlightjs 代码高亮
    C# 动态调用http及 webservice服务
    API接口优化的几个方面
    Leetcode__1508. Range Sum of Sorted Subarray Sums
    Batch Normalization 以及 Pytorch的实现
    Pytorch Transformer 中 Position Embedding 的实现
  • 原文地址:https://www.cnblogs.com/wkzhao/p/10285442.html
Copyright © 2011-2022 走看看