redis通過pipeline提公升吞吐量

2021-09-20 09:19:10 字數 2902 閱讀 3930

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

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

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

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

在資料推送業務中的效能壓測中,以資料上報 -> 下發應答為一次事務;

而對於這樣的讀寫模型,redis 的操作過於頻繁,很快便導致系統延時過高,吞吐量低下,無法滿足目標;

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

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

普通請求模型

[圖-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.sync();

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

i += j;

} finally }}

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

[圖-nopipeline]

[圖-pipeline]

官方文件-redis-pipelining

官方文件-redis-transaction

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

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

Redis管道機制(pipeline)

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

Redis 管道技術 Pipeline

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