亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

手把手教你編寫入門級redis客戶端

includecmath / 3426人閱讀

摘要:為了方便使用,官網(wǎng)推薦了針對各種編程語言的多種客戶端,支持等主流編程語言。協(xié)議被稱為,客戶端通過協(xié)議連接到客戶端的端口默認(rèn)端口。協(xié)議是在中引入的,不過現(xiàn)在已經(jīng)是中的標(biāo)準(zhǔn)協(xié)議了。所以你應(yīng)該再客戶端中實現(xiàn)這個協(xié)議。

Redis是開源的、基于內(nèi)存的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),可用作數(shù)據(jù)庫、緩存以及消息代理方面。Redis支持許多種數(shù)據(jù)結(jié)構(gòu),并內(nèi)置了豐富的諸如冗余、腳本、事務(wù)、持久化等功能,深受業(yè)界喜愛,被各種業(yè)務(wù)系統(tǒng)廣泛使用。為了方便使用,Redis官網(wǎng)推薦了針對各種編程語言的多種客戶端,支持java、c#、python、c++等主流編程語言。那么大家會問,既然Redis客戶端已經(jīng)這么豐富了,為什么還要嘗試自己編寫客戶端?我的看法是,知己知彼,自己嘗試制作Redis客戶端,不僅可以加深對Redis的了解,而且可以通曉Redis客戶端的原理,為今后的更好地使用、乃至定制改造Redis作好充分準(zhǔn)備。

知識準(zhǔn)備

要想親自開發(fā)Redis客戶端,需要以下知識:
1、網(wǎng)絡(luò)編程基礎(chǔ)
2、熟悉Redis協(xié)議
3、了解Redis的基本操作
另外文中的例子將會采用java編寫,因此最好有基本的java編程知識。

面向讀者

本文面向Redis各層次使用者。

Redis Protocal

Redis協(xié)議被稱為:RESP (REdis Serialization Protocol),客戶端通過TCP協(xié)議連接到客戶端的6379端口(默認(rèn)端口)。
RESP協(xié)議是在Redis1.2中引入的,不過現(xiàn)在已經(jīng)是Redis2.0中的標(biāo)準(zhǔn)協(xié)議了。所以你應(yīng)該再Redis客戶端中實現(xiàn)這個協(xié)議。

RESP描述

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

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

客戶端向Redis服務(wù)器發(fā)送命令,以RESP整塊字符串?dāng)?shù)組的形式。

服務(wù)器端根據(jù)命令的結(jié)果,選擇適宜的一種RESP類型返回

簡單字符串

簡單字符串是以半角加號開頭,后跟隨著不含回車換行的字符串,然后以回車換行結(jié)尾。
舉例如下:+OK
簡單字符串是非二進(jìn)制安全的,如果需要二進(jìn)制安全,可使用“整塊字符串”。

錯誤

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

整數(shù)

整數(shù)與簡單字符串類似,頭文字為半角冒號。
舉例如下:
:0
:1000

整塊字符串

整塊字符串可以用來標(biāo)示二進(jìn)制安全的、最大512MB長度的字符串。它以$符號開頭,后跟隨實際字符串長度,以回車換行結(jié)尾,后跟隨實際字符串,再最終以回車換行結(jié)尾。
舉例如下:
$6 foobar
空字符串表現(xiàn)形式如下:$0
nil表現(xiàn)形式如下:$-1

數(shù)組

數(shù)組以半角星號開頭,后接數(shù)組中元素個數(shù),然后以回車換行結(jié)尾,然后后接各個元素。
舉例如下:
空數(shù)組:*0
包含兩個整塊字符串的數(shù)組:*2 $3 foo $3 bar
包含三個整數(shù)的數(shù)組:*3 :1 :2 :3
數(shù)組還支持嵌套。

Redis客戶端原理

要實現(xiàn)和Redis服務(wù)端通信,首先需要與Redis服務(wù)端建立TCP通信連接,然后使用上述的RESP協(xié)議,將想要執(zhí)行的Redis命令發(fā)送至服務(wù)端,并等待服務(wù)端響應(yīng),然后接收到響應(yīng)結(jié)果,展示給用戶。

以下代碼實現(xià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;
            }
        }
    }
}

運行后,系統(tǒng)將會在命令行界面輸出info的執(zhí)行結(jié)果。

結(jié)尾

根據(jù)上述代碼所描述的方法,就可以繼續(xù)擴(kuò)展客戶端的功能,實現(xiàn)Redis各種命令了。

筆者實現(xiàn) 源碼請參考

https://github.com/yourcaptai...

maven中央倉庫

  net.yesdata
  dudu-RESP-interpreter
  1.0.4
maven中央倉庫地址

https://oss.sonatype.org

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/66366.html

相關(guān)文章

  • Java深入-框架技巧

    摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現(xiàn)在軟件開發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當(dāng)初愛情萌芽的模樣…… Java 進(jìn)階面試問題列表 -...

    chengtao1633 評論0 收藏0
  • 后端API從入門到放棄指北

    摘要:菜鳥教程框架中文手冊入門目標(biāo)使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...

    Jeffrrey 評論0 收藏0
  • 后端API從入門到放棄指北

    摘要:菜鳥教程框架中文手冊入門目標(biāo)使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...

    sf190404 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<