java中使用jedis以及手寫(xiě)redis客戶端

  • jedis是java中的一個(gè)redis的客戶端庫(kù)来破,使用maven依賴jedis即可在項(xiàng)目中連接redis

maven項(xiàng)目中使用jedis

  • pom文件中添加依賴
 <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
 </dependency>
  • 代碼中使用
Jedis jedis = new Jedis("127.0.0.1",6397); //連接redis服務(wù)器
jedis.set("name","martain");                        //添加一個(gè)字符串
String name = jedis.get("name");               // 獲取一個(gè)字符串
System.out.println("name:"+name);

jedis 的使用非常的簡(jiǎn)單,連接服務(wù)器之后忘古,使用實(shí)例化的對(duì)象基本可以執(zhí)行所有的redis操作

redis 的應(yīng)用層協(xié)議-RESP

RESP是基于TCP的應(yīng)用層協(xié)議,他有如下特點(diǎn):
(1)簡(jiǎn)單的實(shí)現(xiàn)
 ∽缬铡(2)快速地被計(jì)算機(jī)解析
 ∷杩啊(3)簡(jiǎn)單得可以能被人工解析
  (4)網(wǎng)絡(luò)層,Redis在TCP端口6379上監(jiān)聽(tīng)到來(lái)的連接(本質(zhì)就是socket)干旁,客戶端連接到來(lái)時(shí)驶沼,Redis服務(wù)器為此創(chuàng)建一個(gè)TCP連接。在客戶端與服務(wù)器端之間傳輸?shù)拿總€(gè)Redis命令或者數(shù)據(jù)都以\r\n結(jié)尾争群。

測(cè)試RESP協(xié)議

這里通過(guò)啟動(dòng)一個(gè)server socket來(lái)充當(dāng)redis server,然后使用jedis來(lái)連接該服務(wù)器回怜,執(zhí)行set、get方法來(lái)獲取jedis客戶端實(shí)際發(fā)送的數(shù)據(jù)换薄。

自定義服務(wù)器

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author Martin
 * @version 1.0
 * @date 2020/3/23 5:12 下午
 */
public class RedisVM {
    public static void main(String[] args) throws IOException {
        ServerSocket redisVm = new ServerSocket(6398);  // 啟動(dòng)一個(gè)服務(wù)器 端口為6398
        Socket socket = redisVm.accept();            
        byte[] request = new byte[1024];
        InputStream inputStream = socket.getInputStream();
        inputStream.read(request);
        System.out.println(request.toString()); // 直接將流輸出
        socket.close();
        redisVm.close();
    }
}

編寫(xiě)測(cè)試方法

set方法

    @Test
    public void jeditSet(){
        Jedis jedis = new Jedis("127.0.0.1",6398);
        jedis.set("name","martain");
        jedis.close();
    }
// 執(zhí)行set方法后 RedisVM 的控制臺(tái)輸出
*3
$3
SET
$4
name
$7
martain

get方法

    @Test
    public void jeditGet(){
        Jedis jedis = new Jedis("127.0.0.1",6398);
        jedis.get("name");
        jedis.close();
    }
// 執(zhí)行g(shù)et方法后 RedisVM 的控制臺(tái)輸出
*2
$3
GET
$4
name

通過(guò)官方說(shuō)明我們可以知道:
數(shù)據(jù)類(lèi)型Arrays 以*號(hào)開(kāi)頭 格式 * + 數(shù)組元素個(gè)數(shù)
大字符串類(lèi)型 以$號(hào)開(kāi)頭 格式為 $ + 字符串長(zhǎng)度\r\n 字符串\r\n
也可以解釋為:
*后面數(shù)量表示存在幾個(gè)$
$后面數(shù)量表示字符串的長(zhǎng)度

所以如果我們能遵守該約定玉雾,我們就能實(shí)現(xiàn)簡(jiǎn)單的redis客戶端

手寫(xiě)redis客戶端

廢話不多說(shuō),直接上源碼

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * @author Martin
 * @version 1.0
 * @date 2020/3/23 5:26 下午
 */
public class MyClient {
    Socket socket;
    InputStream reader;
    OutputStream writer;
    public MyClient() throws IOException {
        socket = new Socket("127.0.0.1",6397);
        reader = socket.getInputStream();
        writer = socket.getOutputStream();
    }
    public String set(String key,String value) throws IOException {
        StringBuffer command = new StringBuffer();
        command.append("*3").append("\r\n");
        command.append("$3").append("\r\n");
        command.append("SET").append("\r\n");
        command.append("$").append(key.getBytes().length).append("\r\n");
        command.append(key).append("\r\n");
        command.append("$").append(value.getBytes().length).append("\r\n");
        command.append(value).append("\r\n");
        writer.write(command.toString().getBytes());
        byte[] response = new byte[1024];
        reader.read(response);
        return new String(response);
    }
    public String get(String key) throws IOException {
        StringBuffer command = new StringBuffer();
        command.append("*2").append("\r\n");
        command.append("$3").append("\r\n");
        command.append("GET").append("\r\n");
        command.append("$").append(key.getBytes().length).append("\r\n");
        command.append(key).append("\r\n");
        writer.write(command.toString().getBytes());
        byte[] response = new byte[1024];
        reader.read(response);
        return new String(response);
    }
}

測(cè)試方法

    @Test
    public void MyClientTest() throws IOException {
        MyClient client = new MyClient();
        client.set("name", "java");
        String name = client.get("name");
        System.out.print(name);
    }

測(cè)試輸出

$4
java

怎么樣轻要?是否是非常簡(jiǎn)單复旬?

一、redis 入門(mén)(一)

二冲泥、redis 入門(mén)(二)

三驹碍、手寫(xiě)redis客戶端

四、redis 讀寫(xiě)分離凡恍、高可用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末志秃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嚼酝,更是在濱河造成了極大的恐慌浮还,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件革半,死亡現(xiàn)場(chǎng)離奇詭異碑定,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)又官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)延刘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人六敬,你說(shuō)我怎么就攤上這事碘赖。” “怎么了外构?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵普泡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我审编,道長(zhǎng)撼班,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任垒酬,我火速辦了婚禮砰嘁,結(jié)果婚禮上件炉,老公的妹妹穿的比我還像新娘。我一直安慰自己矮湘,他們只是感情好斟冕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缅阳,像睡著了一般磕蛇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上十办,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天秀撇,我揣著相機(jī)與錄音,去河邊找鬼橘洞。 笑死捌袜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炸枣。 我是一名探鬼主播虏等,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼适肠!你這毒婦竟也來(lái)了霍衫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侯养,失蹤者是張志新(化名)和其女友劉穎敦跌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逛揩,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柠傍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辩稽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惧笛。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逞泄,靈堂內(nèi)的尸體忽然破棺而出患整,到底是詐尸還是另有隱情,我是刑警寧澤喷众,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布各谚,位于F島的核電站,受9級(jí)特大地震影響到千,放射性物質(zhì)發(fā)生泄漏昌渤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一憔四、第九天 我趴在偏房一處隱蔽的房頂上張望愈涩。 院中可真熱鬧望抽,春花似錦、人聲如沸履婉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毁腿。三九已至,卻和暖如春苛茂,著一層夾襖步出監(jiān)牢的瞬間已烤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工妓羊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胯究,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓躁绸,卻偏偏與公主長(zhǎng)得像裕循,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子净刮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 手寫(xiě)Redis客戶端-實(shí)現(xiàn)自己的Jedis 上一篇剥哑,我們?cè)敿?xì)研究了Redis底層使用的協(xié)議——RESP(REdis...
    消失er閱讀 1,156評(píng)論 0 2
  • Java客戶端Jedis Java有很多優(yōu)秀的Redis客戶端(詳見(jiàn):http://redis.io/client...
    linuxzw閱讀 1,481評(píng)論 1 5
  • RESP 文章開(kāi)始前株婴,先放出兩道面試題1.Redis底層,使用的什么協(xié)議?2.RESP是什么暑认,在Redis怎么體現(xiàn)...
    消失er閱讀 4,308評(píng)論 1 2
  • 1. Redis通信協(xié)議 Jedis Client是Redis官網(wǎng)推薦的一個(gè)面向java客戶端困介,庫(kù)文件實(shí)現(xiàn)了對(duì)re...
    ElevenKing閱讀 254評(píng)論 0 0
  • 1. Redis通信協(xié)議 Jedis Client是Redis官網(wǎng)推薦的一個(gè)面向java客戶端,庫(kù)文件實(shí)現(xiàn)了對(duì)re...
    tracy_668閱讀 9,721評(píng)論 0 13