成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

手把手教你編寫入門級(jí)redis客戶端

includecmath / 3366人閱讀

摘要:為了方便使用,官網(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 Protocal

Redis協(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描述

RESP其實(shí)是一個(gè)序列化協(xié)議,支持簡(jiǎn)單字符串、錯(cuò)誤、整數(shù)、整塊字符串和數(shù)組。數(shù)據(jù)類型依賴頭文字,分別表示如下:
簡(jiǎn)單字符串的頭文字是“+”
錯(cuò)誤的頭文字是“-”
整數(shù)的頭文字是“:”
整塊字符串的頭文字是“$”
數(shù)組的頭文字是“*”

RESP在請(qǐng)求-響應(yīng)模型中的用法

客戶端向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ò)誤

錯(cuò)誤和簡(jiǎn)單字符串類似,但頭文字換成半角減號(hào)了。后面跟隨的文字,可以視為錯(cuò)誤消息內(nèi)容。
舉例如下:
-ERR unknown command "foobar"
-WRONGTYPE Operation against a key holding the wrong kind of value

整數(shù)

整數(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ù)組

數(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ù)組還支持嵌套。

Redis客戶端原理

要實(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ù)

  net.yesdata
  dudu-RESP-interpreter
  1.0.4
maven中央倉(cāng)庫(kù)地址

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

相關(guān)文章

  • Java深入-框架技巧

    摘要:從使用到原理學(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)題列表 -...

    chengtao1633 評(píng)論0 收藏0
  • 后端API從入門到放棄指北

    摘要:菜鳥(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...

    Jeffrrey 評(píng)論0 收藏0
  • 后端API從入門到放棄指北

    摘要:菜鳥(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...

    sf190404 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

includecmath

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<