摘要:為了方便使用,官網推薦了針對各種編程語言的多種客戶端,支持等主流編程語言。協議被稱為,客戶端通過協議連接到客戶端的端口默認端口。協議是在中引入的,不過現在已經是中的標準協議了。所以你應該再客戶端中實現這個協議。
Redis是開源的、基于內存的數據結構存儲系統,可用作數據庫、緩存以及消息代理方面。Redis支持許多種數據結構,并內置了豐富的諸如冗余、腳本、事務、持久化等功能,深受業界喜愛,被各種業務系統廣泛使用。為了方便使用,Redis官網推薦了針對各種編程語言的多種客戶端,支持java、c#、python、c++等主流編程語言。那么大家會問,既然Redis客戶端已經這么豐富了,為什么還要嘗試自己編寫客戶端?我的看法是,知己知彼,自己嘗試制作Redis客戶端,不僅可以加深對Redis的了解,而且可以通曉Redis客戶端的原理,為今后的更好地使用、乃至定制改造Redis作好充分準備。
知識準備要想親自開發Redis客戶端,需要以下知識:
1、網絡編程基礎
2、熟悉Redis協議
3、了解Redis的基本操作
另外文中的例子將會采用java編寫,因此最好有基本的java編程知識。
本文面向Redis各層次使用者。
Redis ProtocalRedis協議被稱為:RESP (REdis Serialization Protocol),客戶端通過TCP協議連接到客戶端的6379端口(默認端口)。
RESP協議是在Redis1.2中引入的,不過現在已經是Redis2.0中的標準協議了。所以你應該再Redis客戶端中實現這個協議。
RESP其實是一個序列化協議,支持簡單字符串、錯誤、整數、整塊字符串和數組。數據類型依賴頭文字,分別表示如下:
簡單字符串的頭文字是“+”
錯誤的頭文字是“-”
整數的頭文字是“:”
整塊字符串的頭文字是“$”
數組的頭文字是“*”
客戶端向Redis服務器發送命令,以RESP整塊字符串數組的形式。
服務器端根據命令的結果,選擇適宜的一種RESP類型返回
簡單字符串簡單字符串是以半角加號開頭,后跟隨著不含回車換行的字符串,然后以回車換行結尾。
舉例如下:+OK
簡單字符串是非二進制安全的,如果需要二進制安全,可使用“整塊字符串”。
錯誤和簡單字符串類似,但頭文字換成半角減號了。后面跟隨的文字,可以視為錯誤消息內容。
舉例如下:
-ERR unknown command "foobar"
-WRONGTYPE Operation against a key holding the wrong kind of value
整數與簡單字符串類似,頭文字為半角冒號。
舉例如下:
:0
:1000
整塊字符串可以用來標示二進制安全的、最大512MB長度的字符串。它以$符號開頭,后跟隨實際字符串長度,以回車換行結尾,后跟隨實際字符串,再最終以回車換行結尾。
舉例如下:
$6
foobar
空字符串表現形式如下:$0
nil表現形式如下:$-1
數組以半角星號開頭,后接數組中元素個數,然后以回車換行結尾,然后后接各個元素。
舉例如下:
空數組:*0
包含兩個整塊字符串的數組:*2
$3
foo
$3
bar
包含三個整數的數組:*3
:1
:2
:3
數組還支持嵌套。
要實現和Redis服務端通信,首先需要與Redis服務端建立TCP通信連接,然后使用上述的RESP協議,將想要執行的Redis命令發送至服務端,并等待服務端響應,然后接收到響應結果,展示給用戶。
以下代碼實現了一個簡單的獲取info的操作。
package my_redis_client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.nio.CharBuffer; /** * Hello world! * */ public class App { public static void main( String[] args ) { //定義redis服務端默認端口 int port = 6379; Socket socket = null; BufferedReader in = null; PrintWriter out = null; try { //創建tcp連接 socket = new Socket("localhost", port); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); //傳送info命令 //客戶端向Redis服務器發送命令,以RESP整塊字符串數組的形式 out.println("*1 $4 info "); System.out.println("Redis command wat sent successfully."); //接收服務器的回復 CharBuffer response = CharBuffer.allocate(1024); int readedLen = in.read(response); String responseBody = response.flip().toString(); //輸出服務器的回復 System.out.println(responseBody); } catch(Exception e) { e.printStackTrace(); } finally { //最后關閉相關的流 if (out != null){ out.close(); out = null; } if (in != null) { try { in.close(); } catch(IOException e){ e.printStackTrace(); } in = null; } if (socket != null) { try { socket.close(); } catch(IOException e){ e.printStackTrace(); } socket = null; } } } }
運行后,系統將會在命令行界面輸出info的執行結果。
結尾根據上述代碼所描述的方法,就可以繼續擴展客戶端的功能,實現Redis各種命令了。
筆者實現 源碼請參考https://github.com/yourcaptai...
maven中央倉庫maven中央倉庫地址net.yesdata dudu-RESP-interpreter 1.0.4
https://oss.sonatype.org
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66366.html
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
閱讀 1330·2021-11-25 09:43
閱讀 739·2021-11-18 10:02
閱讀 2862·2021-09-07 09:59
閱讀 2748·2021-08-30 09:44
閱讀 2921·2019-08-30 13:17
閱讀 2305·2019-08-29 12:17
閱讀 1673·2019-08-28 17:57
閱讀 1281·2019-08-26 14:04