redis通過pipeline提公升吞吐量的方法

2022-09-26 12:42:25 字數 2673 閱讀 7660

案例目標

簡單介紹 redis pipeline 的機制,結合一段例項說明pipeline 在提公升吞吐量方面發生的效用。

案例背景

應用系統在資料推送或事件處理過程中,往往出現資料流經過多個網元;

然而在某些服務中程式設計客棧,資料操作對redis 是強依賴的,在最近的一次分析中發現:

一次資料推送會對 redis 產生近30次讀寫操作!

在資料推送業務中的效能壓測中,以資料上報 -> 下發應答為一次事務;而對於這樣的讀寫模型,redis 的操作過於頻繁,很快便導致系統延時過高,吞吐量低下,無法滿足目標;

優化過程 主要針對業務**做的優化,其中redis 操作經過大量合併,最終降低到原來的1/5,而系統吞吐量也提公升明顯。

其中,redis pipeline(管道機制) 的應用是乙個關鍵手段。

pipeline的解釋

pipeline指的是管道技術,指的是客戶端允許將多個請求依次發給伺服器,過程中而不需要等待請求的回覆,在最後再一併讀取結果即可。

管道技術使用廣泛,例如許多pop3協議已經實現支援這個功能,大大加快了從伺服器**新郵件的過程。 redis很早就支援管道(pipeline)技術。(因此無論你執行的是什麼版本,你都可以使用管道(pipelining)操作redis)

普通請求模型

[圖-pipeline1]

pipeline請求模型

[圖-pipeline2]

從兩個圖的對比中可看出,普通的請求模型是同步的,每次請求對應一次io操作等待;

而pipeline 化之後所有的請求合併為一次io,除了時延可以降低之外,還能大幅度提公升系統吞吐量。

**例項

說明本地開啟50個執行緒,每個執行緒完成1000個key的寫入,對比pipeline開啟及不開啟兩種場景下的效能表現。

相關常量

// 併發任務

private static final int taskcount = 50;

// pipeline大小

private static final int batchsize = 10;

// 每個任務處理命令數

private static final int cmdcount = 1000;

private static final boolean usepipeline = true;

初始化連線

jedispoolconfig poolconfig = new jedispoolconfig();

poolconfig.setmaxactive(200);

poolconfig.setmaxidle(100);

poolconfig.setmaxwait(2000);

poolconfig.settestonborrow(false);

poolconfig.settestonreturn(false);

jedispool = new jedispool(poolconfig, host, port);

併發啟動任務,統計執行時間

public static void main(string args) throws interruptedexception

latch.await();

executor.shutdownnow();

long t2 = system.currenttimemillis();

system.out.println("execution finish time(s):" + (t2 - t1) / 1000.0);

}demotask 封裝了執行key寫入的細節,區分不同場景

public void run() ] start.", id);

try else

} finally

logger.info("task[{}] end.", id);

}不使用pipeline的場景比較簡單,迴圈執行set操作

for (int i = 0; i < cmdcount; i++) finally

}if (i % batchsize == 0) ] process -- {}", id, i);}}

使用pipeline,需要處理分段,如10個作為一批命令執行

for (int i = 0; i < cmdcount;) else

}pipeline.

logger.info("task[{}] pipeline -- {}", id, i + j);

i += j;

} finally }}

執行結果

不使用pipeline,整體執行26s;而使用pipeline優化後的**,執行時間僅需要3s!

nopipeline-stat

[圖-nopipeline]

pipeline-stat

[圖-pipeline]

注意事項

pipeline機制可以優化吞吐量,但無法提供原子性/事務保障,而這個可以通過redis-multi等命令實現。

參考這裡

部分讀寫操作存在相關依賴,無法使用pipeline實現,可利用script機制,但需要在可維護性方面做好取捨。

擴充套件閱讀

官方文件-redis-pipelining

官方文件-redis-transaction

本文標題: redis通過pipeline提公升吞吐量的方法

本文位址:

redis通過pipeline提公升吞吐量

簡單介紹 redis pipeline 的機制,結合一段例項說明pipeline 在提公升吞吐量方面發生的效用。應用系統在資料推送或事件處理過程中,往往出現資料流經過多個網元 然而在某些服務中,資料操作對redis 是強依賴的,在最近的一次分析中發現 一次資料推送會對 redis 產生近30次讀寫操...

Redis管道機制(pipeline)

redis管道機制 pipeline redis的管道機制,其實是為了批量讀寫而設計的,如果進行多次的讀和寫資料到redis,每次都建立乙個鏈結,這樣是比較消耗資源的,而且也比較忙,於是想到了管道機制 pipeline 只建立乙個連線,然後批量執行讀或寫。插入資料效果 非管道 資料量 2w,執行時間...

Redis 管道技術 Pipeline

管道技術 pipeline 是客戶端提供的一種批處理技術,用於一次處理多個 redis 命令,從而提高整個互動的效能。通常情況下 redis 是單行執行的,客戶端先向伺服器傳送請求,服務端接收並處理請求後再把結果返回給客戶端,這種處理模式在非頻繁請求時不會有任何問題。但如果出現集中大批量的請求時,因...