1. RTT
Redis 是一種基于客戶端-服務(wù)端模型以及請求/響應(yīng)協(xié)議的TCP服務(wù)。這意味著通常情況下 Redis 客戶端執(zhí)行一條命令分為如下四個(gè)過程:
客戶端向服務(wù)端發(fā)送一個(gè)查詢請求,并監(jiān)聽Socket返回,通常是以阻塞模式,等待服務(wù)端響應(yīng)。服務(wù)端處理命令,并將結(jié)果返回給客戶端??蛻舳撕头?wù)端通過網(wǎng)絡(luò)進(jìn)行連接。這個(gè)連接可以很快,也可能很慢。無論網(wǎng)絡(luò)如何延遲,數(shù)據(jù)包總是能從客戶端到達(dá)服務(wù)端,服務(wù)端返回?cái)?shù)據(jù)給客戶端。
這個(gè)時(shí)間被稱為 RTT (Round Trip Time),例如上面過程的發(fā)送命令和返回結(jié)果兩個(gè)過程。當(dāng)客戶端需要連續(xù)執(zhí)行多次請求時(shí)很容易看到這是如何影響性能的(例如,添加多個(gè)元素到同一個(gè)列表中)。例如,如果 RTT 時(shí)間是250毫秒(網(wǎng)絡(luò)連接很慢的情況下),即使服務(wù)端每秒能處理100k的請求量,那我們每秒最多也只能處理4個(gè)請求。如果使用的是本地環(huán)回接口,RTT 就短得多,但如如果需要連續(xù)執(zhí)行多次寫入,這也是一筆很大的開銷。
下面我們看一下執(zhí)行 N 次命令的模型:
2. Pipeline
我們可以使用 Pipeline 改善這種情況。Pipeline 并不是一種新的技術(shù)或機(jī)制,很多技術(shù)上都使用過。RTT 在不同網(wǎng)絡(luò)環(huán)境下會(huì)不同,例如同機(jī)房和同機(jī)房會(huì)比較快,跨機(jī)房跨地區(qū)會(huì)比較慢。Redis 很早就支持 Pipeline 技術(shù),因此無論你運(yùn)行的是什么版本,你都可以使用 Pipeline 操作 Redis。
Pipeline 能將一組 Redis 命令進(jìn)行組裝,通過一次 RTT 傳輸給 Redis,再將這組 Redis 命令按照順序執(zhí)行并將結(jié)果返回給客戶端。上圖沒有使用 Pipeline 執(zhí)行了 N 條命令,整個(gè)過程需要 N 次 RTT。下圖為使用 Pipeline 執(zhí)行 N 條命令,整個(gè)過程僅需要 1 次 RTT:
Redis 提供了批量操作命令(例如 mget,mset等),有效的節(jié)約了RTT。但大部分命令是不支持批量操作的。
3. Java Pipeline
Jedis 也提供了對 Pipeline 特性的支持。我們可以借助 Pipeline 來模擬批量刪除,雖然不會(huì)像 mget 和 mset 那樣是一個(gè)原子命令,但是在絕大數(shù)情況下可以使用:
public void mdel(ListString> keys){ Jedis jedis = new Jedis("127.0.0.1"); // 創(chuàng)建Pipeline對象 Pipeline pipeline = jedis.pipelined(); for (String key : keys){ // 組裝命令 pipeline.del(key); } // 執(zhí)行命令 pipeline.sync(); }
4. 性能測試
下表給出了不同網(wǎng)絡(luò)環(huán)境下非 Pipeline 和 Pipeline 執(zhí)行 10000 次 set 操作的效果:
網(wǎng)絡(luò) | 延遲 | 非Pipeline | Pipeline |
---|---|---|---|
本機(jī) | 0.17ms | 573ms | 134ms |
內(nèi)網(wǎng)服務(wù)器 | 0.41ms | 1610ms | 240ms |
異地機(jī)房 | 7ms | 78499ms | 1104ms |
因測試環(huán)境不同可能會(huì)得到不同的測試數(shù)據(jù),本測試 Pipeline 每次攜帶 100 條命令。
我們可以從上表中得出如下結(jié)論:
5. 批量命令與Pipeline對比
下面我們看一下批量命令與 Pipeline 的區(qū)別:
6. 注意點(diǎn)
使用 Pipeline 發(fā)送命令時(shí),每次 Pipeline 組裝的命令個(gè)數(shù)不能沒有節(jié)制,否則一次組裝的命令數(shù)據(jù)量過大,一方面會(huì)增加客戶端的等待時(shí)間,另一方面會(huì)造成一定的網(wǎng)絡(luò)阻塞,可以將一次包含大量命令的 Pipeline 拆分成多個(gè)較小的 Pipeline 來完成。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。
標(biāo)簽:定州 泰州 南寧 拉薩 畢節(jié) 河源 甘南 伊春
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis利用Pipeline加速查詢速度的方法》,本文關(guān)鍵詞 Redis,利用,Pipeline,加速,查詢,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。