欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis利用Pipeline加速查詢速度的方法

 更新時間:2019年07月01日 08:25:22   作者:sjf0115  
這篇文章主要給大家介紹了關(guān)于Redis利用Pipeline加速查詢速度的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

1. RTT

Redis 是一種基于客戶端-服務(wù)端模型以及請求/響應(yīng)協(xié)議的TCP服務(wù)。這意味著通常情況下 Redis 客戶端執(zhí)行一條命令分為如下四個過程:

  • 發(fā)送命令
  • 命令排隊
  • 命令執(zhí)行
  • 返回結(jié)果

客戶端向服務(wù)端發(fā)送一個查詢請求,并監(jiān)聽Socket返回,通常是以阻塞模式,等待服務(wù)端響應(yīng)。服務(wù)端處理命令,并將結(jié)果返回給客戶端??蛻舳撕头?wù)端通過網(wǎng)絡(luò)進(jìn)行連接。這個連接可以很快,也可能很慢。無論網(wǎng)絡(luò)如何延遲,數(shù)據(jù)包總是能從客戶端到達(dá)服務(wù)端,服務(wù)端返回數(shù)據(jù)給客戶端。

這個時間被稱為 RTT (Round Trip Time),例如上面過程的發(fā)送命令和返回結(jié)果兩個過程。當(dāng)客戶端需要連續(xù)執(zhí)行多次請求時很容易看到這是如何影響性能的(例如,添加多個元素到同一個列表中)。例如,如果 RTT 時間是250毫秒(網(wǎng)絡(luò)連接很慢的情況下),即使服務(wù)端每秒能處理100k的請求量,那我們每秒最多也只能處理4個請求。如果使用的是本地環(huán)回接口,RTT 就短得多,但如如果需要連續(xù)執(zhí)行多次寫入,這也是一筆很大的開銷。

下面我們看一下執(zhí)行 N 次命令的模型:

2. Pipeline

我們可以使用 Pipeline 改善這種情況。Pipeline 并不是一種新的技術(shù)或機(jī)制,很多技術(shù)上都使用過。RTT 在不同網(wǎng)絡(luò)環(huán)境下會不同,例如同機(jī)房和同機(jī)房會比較快,跨機(jī)房跨地區(qū)會比較慢。Redis 很早就支持 Pipeline 技術(shù),因此無論你運(yùn)行的是什么版本,你都可以使用 Pipeline 操作 Redis。

Pipeline 能將一組 Redis 命令進(jìn)行組裝,通過一次 RTT 傳輸給 Redis,再將這組 Redis 命令按照順序執(zhí)行并將結(jié)果返回給客戶端。上圖沒有使用 Pipeline 執(zhí)行了 N 條命令,整個過程需要 N 次 RTT。下圖為使用 Pipeline 執(zhí)行 N 條命令,整個過程僅需要 1 次 RTT:

Redis 提供了批量操作命令(例如 mget,mset等),有效的節(jié)約了RTT。但大部分命令是不支持批量操作的。

3. Java Pipeline

Jedis 也提供了對 Pipeline 特性的支持。我們可以借助 Pipeline 來模擬批量刪除,雖然不會像 mget 和 mset 那樣是一個原子命令,但是在絕大數(shù)情況下可以使用:

public void mdel(List<String> 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)境不同可能會得到不同的測試數(shù)據(jù),本測試 Pipeline 每次攜帶 100 條命令。

我們可以從上表中得出如下結(jié)論:

  • Pipeline 執(zhí)行速度一般比逐條執(zhí)行要快。
  • 客戶端和服務(wù)端的網(wǎng)絡(luò)延時越大,Pipeline 的效果越明顯。

5. 批量命令與Pipeline對比

下面我們看一下批量命令與 Pipeline 的區(qū)別:

  • 原生批量命令是原子的,Pipeline 是非原子的。
  • 原生批量命令是一個命令對應(yīng)多個 key,Pipeline 支持多個命令。
  • 原生批量命令是 Redis 服務(wù)端支持實現(xiàn)的,而 Pipeline 需要服務(wù)端和客戶端的共同實現(xiàn)。

6. 注意點

使用 Pipeline 發(fā)送命令時,每次 Pipeline 組裝的命令個數(shù)不能沒有節(jié)制,否則一次組裝的命令數(shù)據(jù)量過大,一方面會增加客戶端的等待時間,另一方面會造成一定的網(wǎng)絡(luò)阻塞,可以將一次包含大量命令的 Pipeline 拆分成多個較小的 Pipeline 來完成。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 無法啟動Redis打開redis-server閃退的問題解決辦法

    無法啟動Redis打開redis-server閃退的問題解決辦法

    正常開啟redis服務(wù),首先要啟動redis-server.exe,但是閃退,導(dǎo)致無法開啟redis服務(wù),這篇文章主要給大家介紹了關(guān)于無法啟動Redis打開redis-server閃退問題的解決辦法,需要的朋友可以參考下
    2024-07-07
  • redis的string類型及bitmap介紹

    redis的string類型及bitmap介紹

    這篇文章主要介紹了redis的string類型及bitmap介紹,redis有很多的客戶端連接進(jìn)來,站在redis所在機(jī)器的角度來說,就是有很多socket的連接
    2022-07-07
  • 詳解redis在微服務(wù)領(lǐng)域的貢獻(xiàn)

    詳解redis在微服務(wù)領(lǐng)域的貢獻(xiàn)

    本文以dubbo為例看下redis是如何利用自身特性來完成注冊中心的功能,對redis微服務(wù)相關(guān)知識感興趣的朋友一起看看吧
    2021-10-10
  • windows下通過批處理腳本啟動redis的操作

    windows下通過批處理腳本啟動redis的操作

    本文主要給大家介紹了windows下通過批處理腳本啟動redis的操作,windows下redis啟動,需要進(jìn)入redis安裝目錄,然后shift+右鍵,選擇“在此處打開命令窗口”,然后輸入redis-server.exe redis.conf,就可以啟動redis了,文中有詳細(xì)的圖文參考,感興趣的朋友可以參考下
    2023-12-12
  • 詳解redis desktop manager安裝及連接方式

    詳解redis desktop manager安裝及連接方式

    這篇文章主要介紹了redis desktop manager安裝及連接方式,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • RedisAPI原子性操作及原理解析

    RedisAPI原子性操作及原理解析

    這篇文章主要介紹了RedisAPI原子性操作及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • Redis高性能的原因及說明

    Redis高性能的原因及說明

    這篇文章主要介紹了Redis高性能的原因及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 關(guān)于Redis中bitmap的原理和使用詳解

    關(guān)于Redis中bitmap的原理和使用詳解

    這篇文章主要介紹了關(guān)于Redis中bitmap的原理和使用詳解,BitMap即位圖,使用每個位表示某種狀態(tài),適合處理整型的海量數(shù)據(jù),本質(zhì)上是哈希表的一種應(yīng)用實現(xiàn),需要的朋友可以參考下
    2023-05-05
  • Redis緩存IO模型的演進(jìn)教程示例精講

    Redis緩存IO模型的演進(jìn)教程示例精講

    這篇文章主要為大家介紹了Redis線程IO模型演進(jìn)的教程示例精講,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • Redis教程(十一):虛擬內(nèi)存介紹

    Redis教程(十一):虛擬內(nèi)存介紹

    這篇文章主要介紹了Redis教程(十一):虛擬內(nèi)存介紹,本文講解了虛擬內(nèi)存簡介、應(yīng)用場景和配置方法等內(nèi)容,需要的朋友可以參考下
    2015-04-04

最新評論