最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. RTT

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

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

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

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

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

2. Pipeline

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

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

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

3. Java Pipeline

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

public void mdel(List<String> keys){
 Jedis jedis = new Jedis("127.0.0.1");
 // 創(chuàng)建Pipeline對(duì)象
 Pipeline pipeline = jedis.pipelined();
 for (String key : keys){
  // 組裝命令
  pipeline.del(key);
 }
 // 執(zhí)行命令
 pipeline.sync();
}

4. 性能測(cè)試

下表給出了不同網(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

因測(cè)試環(huán)境不同可能會(huì)得到不同的測(cè)試數(shù)據(jù),本測(cè)試 Pipeline 每次攜帶 100 條命令。

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

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

5. 批量命令與Pipeline對(duì)比

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

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

6. 注意點(diǎn)

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

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

相關(guān)文章

  • Redis三種集群模式詳解

    Redis三種集群模式詳解

    redis有三種集群模式,其中主從是最常見(jiàn)的模式,今天通過(guò)本文給大家分享Redis三種集群模式介紹,感興趣的朋友一起看看吧
    2021-10-10
  • 通過(guò) Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用(支持多種編程語(yǔ)言)

    通過(guò) Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用(支持多種編程語(yǔ)言)

    這篇文章主要介紹了通過(guò) Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用,支持多種編程語(yǔ)言,本文就以Ruby和Python為例,給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • Redis 的各項(xiàng)功能主要解決了什么問(wèn)題

    Redis 的各項(xiàng)功能主要解決了什么問(wèn)題

    Redis是一個(gè)基于BSD開源的項(xiàng)目,是一個(gè)把結(jié)構(gòu)化的數(shù)據(jù)放在內(nèi)存中的一個(gè)存儲(chǔ)系統(tǒng),你可以把它作為數(shù)據(jù)庫(kù),緩存和消息中間件來(lái)使用。這篇文章主要介紹了Redis 的各項(xiàng)功能主要解決了什么問(wèn)題,需要的朋友可以參考下
    2018-10-10
  • Redis 基礎(chǔ)教程之事務(wù)的使用方法

    Redis 基礎(chǔ)教程之事務(wù)的使用方法

    這篇文章主要介紹了Redis 基礎(chǔ)教程之事務(wù)的使用方法的相關(guān)資料,Redis 事務(wù)可以一次執(zhí)行多個(gè)命令和保證,單獨(dú)的隔離操作和原子操作需要的朋友可以參考下
    2017-08-08
  • Redis分布式非公平鎖的使用

    Redis分布式非公平鎖的使用

    分布式鎖很多人都能接觸到,本文主要介紹了Redis分布式非公平鎖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺析PHP分布式中Redis實(shí)現(xiàn)Session的方法

    淺析PHP分布式中Redis實(shí)現(xiàn)Session的方法

    這篇文章主要介紹了PHP分布式中Redis實(shí)現(xiàn)Session的方法,文中詳細(xì)介紹了兩種方法的使用方法,并給出了測(cè)試的示例代碼,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧,
    2016-12-12
  • Redis如何實(shí)現(xiàn)計(jì)數(shù)統(tǒng)計(jì)

    Redis如何實(shí)現(xiàn)計(jì)數(shù)統(tǒng)計(jì)

    這篇文章主要介紹了Redis如何實(shí)現(xiàn)計(jì)數(shù)統(tǒng)計(jì)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Redis分布式鎖及安全問(wèn)題解決

    Redis分布式鎖及安全問(wèn)題解決

    在分布式環(huán)境中,遇到搶購(gòu)等訪問(wèn)共享資源的場(chǎng)景時(shí),需要我們有一種鎖機(jī)制去解決并發(fā)問(wèn)題,本文主要介紹了Redis分布式鎖及安全問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • CentOS 6.5 64位下安裝Redis3.0.2的具體步驟

    CentOS 6.5 64位下安裝Redis3.0.2的具體步驟

    這篇文章主要介紹了CentOS 6.5 64位下安裝Redis3.0.2的具體步驟,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • 如何利用Redis?List實(shí)現(xiàn)Java數(shù)據(jù)庫(kù)分頁(yè)快速查詢

    如何利用Redis?List實(shí)現(xiàn)Java數(shù)據(jù)庫(kù)分頁(yè)快速查詢

    這篇文章主要給大家介紹了關(guān)于如何利用Redis?List實(shí)現(xiàn)Java數(shù)據(jù)庫(kù)分頁(yè)快速查詢的相關(guān)資料,Redis是一個(gè)高效的內(nèi)存數(shù)據(jù)庫(kù),它支持包括String、List、Set、SortedSet和Hash等數(shù)據(jù)類型的存儲(chǔ),需要的朋友可以參考下
    2024-02-02

最新評(píng)論

若羌县| 阿克苏市| 临海市| 绥江县| 舟山市| 肥西县| 乡宁县| 嘉祥县| 繁峙县| 赣州市| 嵩明县| 石狮市| 龙海市| 商水县| 惠州市| 大新县| 鲁甸县| 且末县| 左云县| 明光市| 无锡市| 明溪县| 光泽县| 安乡县| 濮阳市| 吉水县| 盐边县| 从化市| 开阳县| 灵寿县| 巍山| 上高县| 佛山市| 长沙市| 冕宁县| 洱源县| 柞水县| 彰化县| 都安| 临夏市| 静宁县|