共計 1978 個字符,預計需要花費 5 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章給大家分享的是有關 Redis 協議的示例分析的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考。一起跟隨丸趣 TV 小編過來看看吧。
前言
我們用過很多 redis 的客戶端,有沒有相過自己擼一個 redis 客戶端?
其實很簡單,基于 socket,監聽 6379 端口,解析數據就可以了。
redis 協議
解析數據的過程主要依賴于 redis 的協議了。
我們寫個簡單例子看下 redis 的協議:
public class RedisTest {public static void main(String[] args) {Jedis jedis = new Jedis( 127.0.0.1 , 6379);
jedis.set(eat , I want to eat}
監聽 socket:
public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(6379);
Socket socket = server.accept();
byte[] chars = new byte[64];
socket.getInputStream().read(chars);
System.out.println(new String(chars));
}
看下數據:
*3
I want to eat
參照官方協議文檔 https://redis.io/topics/protocol,解析下數據。
(1)簡單字符串 Simple Strings, 以 + 加號 開頭
(2)錯誤 Errors, 以 – 減號 開頭
(3)整數型 Integer,以 : 冒號開頭
(4)大字符串類型 Bulk Strings, 以 $ 美元符號開頭,長度限制 512M
(5)組類型 Arrays,以 * 星號開頭
并且,協議的每部分都是以 \r\n (CRLF) 結尾的。
所以上面的數據的含義是:
*3 數組包含 3 個元素,分別是 SET、eat、I want to eat
$3 是一個字符串,且字符串長度為 3
SET 字符串的內容
$3 是一個字符串,且字符串長度為 3
eat 字符串的內容
$13 是一個字符串,且字符串長度為 13
I want to eat 字符串的內容
執行 get eat 的數據如下:
*2
eat
擼一個客戶端
掌握了 redis 協議,socket 之后,我們就可以嘗試擼一個客戶端了。
socket:
public RedisClient(String host, int port){
try {this.socket = new Socket(host,port);
this.outputStream = this.socket.getOutputStream();
this.inputStream = this.socket.getInputStream();} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();}
set 協議:
public String set(final String key, String value) {StringBuilder sb = new StringBuilder();
// 雖然輸出的時候,會被轉義,然而我們傳送的時候還是要帶上 \r\n
sb.append(*3).append( \r\n
sb.append($3).append( \r\n
sb.append(SET).append( \r\n
sb.append($).append(key.length()).append( \r\n
sb.append(key).append( \r\n
sb.append($).append(value.length()).append( \r\n
sb.append(value).append( \r\n
byte[] bytes= new byte[1024];
try {outputStream.write(sb.toString().getBytes());
inputStream.read(bytes);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return new String(bytes);
}
測試:
RedisClient redisClient = new RedisClient(127.0.0.1 , 6379);
String result = redisClient.set( eat , please eat
System.out.println(result);
執行結果:
+OK
感謝各位的閱讀!關于 Redis 協議的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!