久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis協議的示例分析

141次閱讀
沒有評論

共計 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 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2024-02-03發表,共計1978字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 丰台区| 英山县| 天镇县| 将乐县| 平塘县| 高青县| 平舆县| 信宜市| 滁州市| 盱眙县| 铜鼓县| 农安县| 龙海市| 留坝县| 靖西县| 临夏县| 宁明县| 江陵县| 台东市| 会东县| 洞口县| 准格尔旗| 洪洞县| 儋州市| 平利县| 桐城市| 盐池县| 高邮市| 仙游县| 泰宁县| 台江县| 西吉县| 察隅县| 资溪县| 建德市| 贵德县| 东城区| 田东县| 南陵县| 栖霞市| 汉沽区|