漫遊jedis-RESP通訊實現
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 的簡單實用。
相關文章
- 漫遊ZooKeeper nio通訊過程
- WiFi漫遊卡頓嚴重,如何有效改善實現無縫漫遊WiFi
- CameraPath實現簡單漫遊
- 漫畫通訊:一圖看懂通訊發展史
- 實現酒店無線覆蓋和無線漫遊
- 網路通訊2:TCP通訊實現TCP
- 漫遊 javax.servlet 請求引數解析(jetty 實現)JavaServletJetty
- 融雲漫話:通訊中臺
- 匿名管道通訊實現
- java實現UDP通訊JavaUDP
- 網易來聊聊子彈簡訊的訊息漫遊技術
- 漫遊HttpURLConnectionHTTP
- golang實現子程式通訊Golang
- Java實現TCP通訊程式JavaTCP
- angular + express 實現websocket通訊AngularExpressWeb
- 利用SQL實現通訊錄SQL
- 呼叫通訊錄實現思路
- 使用Java實現WebSocket通訊JavaWeb
- C# 通過socket實現UDP 通訊C#UDP
- 使用Oracle實現實時通訊(轉)Oracle
- 如何優雅的實現訊息通訊?
- [Alink漫談之三] AllReduce通訊模型模型
- 【漫畫技術】Android跨程式通訊Android
- iOS基於Socket.io即時通訊IM實現,WebRTC實現視訊通話iOSWeb
- 服務端漫遊服務端
- C語言實現TCP通訊C語言TCP
- WebRTC + WebSocket 實現視訊通話Web
- WebSocket實現前後端通訊Web後端
- JAVA通訊(三)——實現多人聊天Java
- C# NModbus RTU通訊實現C#
- Go語言實現TCP通訊GoTCP
- 簡單通訊錄的實現
- 通過 App Groups 實現程式間通訊APP
- JAVA通訊(二)——實現客戶機和伺服器通訊Java伺服器
- 在 OpenResty 裡實現程式間通訊REST
- 實現不同程式之間的通訊
- sharedWorker 實現多頁面通訊
- HTTPS通訊的C++實現HTTPC++