簡單介紹 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 是單行執行的,客戶端先向伺服器傳送請求,服務端接收並處理請求後再把結果返回給客戶端,這種處理模式在非頻繁請求時不會有任何問題。但如果出現集中大批量的請求時,因...