漫遊jedis-RESP通訊實現

炸雞店老闆發表於2017-11-04

Redis 客戶端與伺服器之間的通訊使用的協議Redis Serialization Protocol,簡稱RESP。

insight jedis核心功能:RESP通訊實現。

1. 通訊實現 (redis.clients.jedis.Connection);

2. RESP協議實現 (redis.clients.jedis.Protocol, redis.clients.util.RedisOutputStream, redis.clients.util.RedisInputStream)


jedis 通訊實現(典型的socket 程式設計template):

/**
 * jedis執行命令的典型模板
 * 1. check
 * 2. send command
 * 3. recive result
 **/
public String set(final String key, String value) {
    checkIsInMultiOrPipeline();
    // 
    client.set(key, value);
    return client.getStatusCodeReply();
}

// 客戶端command + arguments 傳送的實現
protected Connection sendCommand(final Command cmd, final byte[]... args) {
    try {
        // 主動check connection,相容socket初始化過程,常用的做法
        connect();
        // 根據RESP,請求資訊以位元組碼寫入os
        Protocol.sendCommand(outputStream, cmd, args);
        pipelinedCommands++;
        return this;
    } catch (JedisConnectionException ex) {
        // 即使報錯,在斷開連線前,得到server 的報錯資訊
        // ...
        // 關鍵標識
        broken = true;
        throw ex;
    }
}

RESP協議實現

首先,瞭解協議內容: https://redis.io/topics/protocol#resp-protocol-description

特點: 實現簡單、解析快速、可讀性強。

然後,insight:

/**
 * 典型的協議編碼實現
 * 
 * 支援的資料型別: Simple Strings, Errors, Integers, Bulk Strings and Arrays.
 * 資料型別的表示:Simple Strings(+), Errors, Integers(:), Bulk Strings($) and Arrays(*)
 * 不同的塊之間一定要用CRLF間隔(\r\n)
 **/
private static void sendCommand(final RedisOutputStream os, final byte[] command, final byte[]... args) {
    try {
        os.write(ASTERISK_BYTE);// * 我是陣列
        os.writeIntCrLf(args.length + 1);// 命令1 + 引數n
        os.write(DOLLAR_BYTE);// $
        os.writeIntCrLf(command.length);// 長度
        os.write(command);// 操作命令
        os.writeCrLf();// 間隔符號
        
        for (final byte[] arg : args) {// 追加入參
            os.write(DOLLAR_BYTE);
            os.writeIntCrLf(arg.length);
            os.write(arg);
            os.writeCrLf();
        }
    } catch (IOException e) {
        throw new JedisConnectionException(e);
    }
}


總結:通訊必用socket,jedis 簡潔的實現RESP 協議完成與服務的通訊,值得借鑑。

後續會Insight pool 的簡單實用。






相關文章