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