jedis 調(diào)用模式

1. jedis對(duì)應(yīng)redis的四種工作模式

image.png

?????? 圖1-1是Jedis的主要模塊,Jedis,JedisCluster,JedisSentinel和ShardedJedis對(duì)應(yīng)了Redis的四種工作模式:Redis Standalone(單節(jié)點(diǎn)模式),Redis Cluster(集群模式),Redis Sentinel(哨兵模式)和Redis Sharding(分片模式)溃斋。

2. jedis的三種請(qǐng)求模式

??????每個(gè)jedis實(shí)例對(duì)應(yīng)一個(gè)Redis節(jié)點(diǎn)陶舞,我們對(duì)jedis實(shí)例的每個(gè)操作,都相當(dāng)于redis-cli啟動(dòng)客戶端的直接操作,無(wú)論是集群模式,哨兵模式,還是分片模式惨险,內(nèi)部均為對(duì)Jedis實(shí)例的操作,所以了解jedis類(lèi)的內(nèi)部結(jié)構(gòu)以及jedis實(shí)例的請(qǐng)求模式是掌握jedis框架的基礎(chǔ)脊髓。
? ?????? Jedis實(shí)例有3種請(qǐng)求模式辫愉,Pipeline,Transaction和Client供炼。


image.png

?????? jedis實(shí)例通過(guò)Socket建立客戶端與服務(wù)端的長(zhǎng)連接一屋,往outputStream發(fā)送命令窘疮,從inputStream讀取回復(fù)。
?????? Client模式就是常用的所見(jiàn)即所得冀墨,客戶端發(fā)送一個(gè)命令闸衫,阻塞等待服務(wù)端執(zhí)行,然后讀取返回結(jié)果诽嘉。
?????? Pipeline模式是一次性發(fā)送多個(gè)命令蔚出,最后一次取回所有的返回結(jié)果,這種模式通過(guò)減少網(wǎng)絡(luò)的往返時(shí)間和io讀寫(xiě)次數(shù)虫腋,大幅度提高通信性能骄酗,但pipeline不支持原子性,要想保證原子性悦冀,可同時(shí)開(kāi)啟事物模式趋翻。
?????? Transaction模式即開(kāi)啟Redis的事務(wù)管理,事務(wù)模式開(kāi)啟后盒蟆,所有的命令(除了exec踏烙,discard,multi和watch)到達(dá)服務(wù)端以后不會(huì)立即執(zhí)行历等,會(huì)進(jìn)入一個(gè)等待隊(duì)列讨惩,等待收到下述四個(gè)命令時(shí)執(zhí)行不同操作:

  1. EXEC命令執(zhí)行時(shí),服務(wù)器以先進(jìn)先出FIFO的方式執(zhí)行事務(wù)隊(duì)列中的命令寒屯,當(dāng)事務(wù)隊(duì)列的所有命令被執(zhí)行完之后荐捻,將回復(fù)隊(duì)列作為自己的執(zhí)行結(jié)果返回給客戶端,客戶端從事務(wù)狀態(tài)返回到非事務(wù)狀態(tài)寡夹。
  2. DISCARD命令用于取消一個(gè)事務(wù)处面,它清空客戶端的整個(gè)事務(wù)隊(duì)列,然后將客戶端從事務(wù)狀態(tài)調(diào)整到非事務(wù)狀態(tài)要出。最后返回字符串 OK 給客戶端鸳君, 說(shuō)明事務(wù)已被取消农渊。
  3. Redis 的事務(wù)是不可嵌套的患蹂, 當(dāng)客戶端已經(jīng)處于事務(wù)狀態(tài), 而客戶端又再向服務(wù)器發(fā)送MULTI時(shí)砸紊, 服務(wù)器只是簡(jiǎn)單地向客戶端發(fā)送一個(gè)錯(cuò)誤传于, 然后繼續(xù)等待其他命令的入隊(duì)。 MULTI命令的發(fā)送不會(huì)造成整個(gè)事務(wù)失敗醉顽, 也不會(huì)修改事務(wù)隊(duì)列中已有的數(shù)據(jù)沼溜。
  4. WATCH只能在客戶端進(jìn)入事務(wù)狀態(tài)之前執(zhí)行, 在事務(wù)狀態(tài)下發(fā)送 WATCH命令會(huì)引發(fā)一個(gè)錯(cuò)誤游添, 但它不會(huì)造成整個(gè)事務(wù)失敗系草, 也不會(huì)修改事務(wù)隊(duì)列中已有的數(shù)據(jù)(和前面處理 MULTI的情況一樣)通熄。

2 jedis的類(lèi)結(jié)構(gòu)

image.png

jedis以輸入的命令參數(shù)是否為二進(jìn)制,將處理請(qǐng)求的具體實(shí)現(xiàn)部署在兩個(gè)類(lèi)中找都,Jedis和BinaryJedis唇辨, Client和BinaryClient。與Redis服務(wù)器的連接信息(Socket能耻,host, port)封裝在Client的基類(lèi)Connection中赏枚,BinaryJedis類(lèi)中提供了Client,Pipeline和Transaction變量晓猛,對(duì)應(yīng)三種請(qǐng)求模式饿幅。

3. jedis的初始化流程

Jedis jedis = new Jedis("localhost", 6379, 15000);
Transaction t = jedis.multi();
Pipeline pipeline = jedis.pipelined();

? Jedis通過(guò)傳入Redis服務(wù)器地址(host,port)開(kāi)始初始化,然后在BinaryJedis里實(shí)例化Client戒职。Client通過(guò)Socket維持客戶端與Redis服務(wù)器的連接與溝通栗恩。
Transaction和Pipeline很相似,他們繼承同一個(gè)基類(lèi)MultiKeyPipelineBase洪燥。區(qū)別在于Transaction在實(shí)例化的時(shí)候摄凡,會(huì)自動(dòng)發(fā)送MULTI命令,開(kāi)啟事務(wù)模式蚓曼,而Pipeline則按情況手動(dòng)開(kāi)啟亲澡,他們都是依靠Client發(fā)送命令,下面通過(guò)發(fā)送一個(gè)get key的命令,看看這三種模式是如何運(yùn)轉(zhuǎn)的纫版。

//BinaryJedis類(lèi)
public Transaction multi() {
client.multi();
transaction = new Transaction(client);
return transaction;
}
public Pipeline pipelined() {
pipeline = new Pipeline();
pipeline.setClient(client);
return pipeline;
}

4. jedis工作模式的調(diào)用流程

4.1 Client模式的調(diào)用流程:
image.png

image.png

從上圖可以看出床绪,在每次發(fā)送命令之前,會(huì)先通過(guò)connect()方法判斷是否已經(jīng)連接其弊,如果未連接則:

  1. 實(shí)例化Socket癞己,并配置
  2. 連接Socket,獲取OutputStream和InputStream
  3. 如果是SSL連接梭伐,通過(guò)SSLSocketFactory創(chuàng)建socket連接
    ??????Protocol是一個(gè)通訊工具類(lèi)痹雅,將Redis的各類(lèi)執(zhí)行關(guān)鍵字存儲(chǔ)為靜態(tài)變量,比如Protocol.Command.GET, 同時(shí)將命令包裝成符合Redis的統(tǒng)一請(qǐng)求協(xié)議糊识,回復(fù)消息的處理也是在這個(gè)類(lèi)進(jìn)行绩社,它先通過(guò)通訊協(xié)議提取出當(dāng)次請(qǐng)求的回復(fù)消息,將Object類(lèi)型的消息轉(zhuǎn)化為String,List 等具體類(lèi)型赂苗,如果回復(fù)消息有Error則以異常的形式拋出愉耙。
4.2 pipeline調(diào)用模式
4.2.1 為什么會(huì)出現(xiàn)Pipeline?

??????Redis本身是基于Request/Response協(xié)議的拌滋,正常情況下朴沿,客戶端發(fā)送一個(gè)命令,等待Redis應(yīng)答,Redis在接收到命令赌渣,處理后應(yīng)答魏铅。在這種情況下,如果同時(shí)需要執(zhí)行大量的命令坚芜,那就是等待上一條命令應(yīng)答后再執(zhí)行沦零,這中間不僅僅多了RTT(Round Time Trip),而且還頻繁的調(diào)用系統(tǒng)IO货岭,發(fā)送網(wǎng)絡(luò)請(qǐng)求路操。


image.png

??????為了提升效率,這時(shí)候Pipeline出現(xiàn)了千贯,它允許客戶端可以一次發(fā)送多條命令屯仗,而不等待上一條命令執(zhí)行的結(jié)果,這和網(wǎng)絡(luò)的Nagel算法有點(diǎn)像(TCP_NODELAY選項(xiàng))搔谴。不僅減少了RTT魁袜,同時(shí)也減少了IO調(diào)用次數(shù)(IO調(diào)用涉及到用戶態(tài)到內(nèi)核態(tài)之間的切換)。


image.png
4.2.2 pipeline詳解
image.png

????上圖為T(mén)ransaction和Pipeline兩個(gè)類(lèi)的類(lèi)結(jié)構(gòu)敦第,可以看到Pipeline和Transaction都繼承MultikeyPipelineBase峰弹,其中,MultiKeyPipelineBase和PipelineBase的區(qū)別在于處理的命令不同芜果,內(nèi)部均調(diào)用Client發(fā)送命令鞠呈,Pipeline有一個(gè)內(nèi)部類(lèi)對(duì)象MultiResponseBuilder,當(dāng)Pipeline開(kāi)啟事務(wù)后,其用于存儲(chǔ)所有返回結(jié)果右钾。Queable用一個(gè)LinkedList裝入每個(gè)命令的返回結(jié)果蚁吝,Response<T>是一個(gè)泛型,set(Object data)方法傳入格式化之前的結(jié)果舀射,get()方法返回格式化之后的結(jié)果窘茁。


image.png

????上圖顯示了Pipeline從發(fā)送請(qǐng)求到讀取回復(fù)的具體實(shí)現(xiàn),Pipeline通過(guò)Client發(fā)送命令(這時(shí)并未真正地發(fā)送命令脆烟,只是將命令放入了緩沖區(qū)山林,緩沖區(qū)大小為8192byte, 超過(guò)這個(gè)大小會(huì)自動(dòng)將緩沖區(qū)的命令輸出到服務(wù)端)邢羔,Client在sendCommand時(shí)驼抹,會(huì)同時(shí)執(zhí)行pipelinedCommands++,記錄發(fā)送命令的條數(shù)。之后张抄,返回一個(gè)Response<T>實(shí)例砂蔽,并將這個(gè)實(shí)例塞入了pipelinedResponses隊(duì)列中洼怔。Response<T>主要有3個(gè)屬性:

  1. 格式化前的回復(fù)消息data,
  2. 格式化后的回復(fù)消息response,
  3. 格式化方式builder署惯。
    ????剛發(fā)送消息后,Response<T>里面的data和response是空值镣隶,只有格式化的方式builder极谊。Sync()用于一次性讀取所有回復(fù)诡右,首先調(diào)用client的getAll()方法,getAll()方法根據(jù)之前記錄的pipelinedCommands和Redis通訊協(xié)議轻猖,getAll()之前先調(diào)用flush()刷新此輸出流并強(qiáng)制寫(xiě)出所有緩沖的輸出字節(jié)(這個(gè)時(shí)候才真正地發(fā)送命令), 然后讀取相同條數(shù)的回復(fù)消息到一個(gè)List帆吻,并返回給Pipeline。隨后遍歷這個(gè)List,逐個(gè)將回復(fù)消息賦給pipelinedResponses中每個(gè)Response<T>的data咙边。在執(zhí)行Response<T>.get()命令時(shí)猜煮,Response<T>里面data已經(jīng)有值了,但是是Object類(lèi)型的败许,因而還要調(diào)用build()方法王带,做一次數(shù)據(jù)轉(zhuǎn)換,返回格式化之后的數(shù)據(jù)市殷。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愕撰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子醋寝,更是在濱河造成了極大的恐慌搞挣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件音羞,死亡現(xiàn)場(chǎng)離奇詭異囱桨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嗅绰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蝇摸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人办陷,你說(shuō)我怎么就攤上這事貌夕。” “怎么了民镜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵啡专,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我制圈,道長(zhǎng)们童,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任鲸鹦,我火速辦了婚禮慧库,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馋嗜。我一直安慰自己齐板,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著甘磨,像睡著了一般橡羞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上济舆,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天卿泽,我揣著相機(jī)與錄音,去河邊找鬼滋觉。 笑死签夭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椎侠。 我是一名探鬼主播覆致,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肺蔚!你這毒婦竟也來(lái)了煌妈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宣羊,失蹤者是張志新(化名)和其女友劉穎璧诵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仇冯,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡之宿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苛坚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比被。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泼舱,靈堂內(nèi)的尸體忽然破棺而出等缀,到底是詐尸還是另有隱情,我是刑警寧澤娇昙,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布尺迂,位于F島的核電站,受9級(jí)特大地震影響冒掌,放射性物質(zhì)發(fā)生泄漏噪裕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一股毫、第九天 我趴在偏房一處隱蔽的房頂上張望膳音。 院中可真熱鬧,春花似錦铃诬、人聲如沸祭陷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颗胡。三九已至毫深,卻和暖如春吩坝,著一層夾襖步出監(jiān)牢的瞬間毒姨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工钉寝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弧呐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓嵌纲,卻偏偏與公主長(zhǎng)得像俘枫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逮走,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理鸠蚪,服務(wù)發(fā)現(xiàn),斷路器师溅,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • NOSQL類(lèi)型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表茅信,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis墓臭,volde...
    MicoCube閱讀 3,981評(píng)論 2 27
  • 1.1 資料 蘸鲸,最好的入門(mén)小冊(cè)子,可以先于一切文檔之前看窿锉,免費(fèi)酌摇。 作者Antirez的博客,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,056評(píng)論 1 51
  • 今天去拿孩子的體檢報(bào)告,白細(xì)胞和紅血球指數(shù)有點(diǎn)偏高洼滚,醫(yī)生建議復(fù)查怯伊!美好的心情突然沉了下來(lái)!自己的管用模式:事情沒(méi)有...
    米勒Li閱讀 201評(píng)論 0 0
  • 現(xiàn)實(shí)是種方式 是夢(mèng)的魘判沟,影射靈魂 是夢(mèng)想的包袱耿芹,臃腫雜亂,不曾甩去 理想編織的夢(mèng)挪哄,被現(xiàn)實(shí)無(wú)情打破 碎末殘片吧秕,待風(fēng)襲...
    流淚的洋蔥頭閱讀 331評(píng)論 0 2