CYQ.Data 操作 Redis 效能測試:對比 StackExchange.Redis

路过秋天發表於2024-03-13

前言:

前幾天,點開自己的部落格,看了一下 CYQ.Data V5系列 都有哪些文章,

發現了一篇2019年寫的:CYQ.Data 對於分散式快取Redis、MemCache高可用的改進及效能測試,於是點進去看了看。

感覺文章中有些表述存有問題,不過不是重點。

重點,看了裡面的測試結論,如果四五年過去了,CYQ.Data 低調的更新,有沒有進步呢?

為了和之前的版本進行對比,好在當年有留下程式碼,就直接拿當年的程式碼來測試一下。

下面就來重新看一下新的測試結果:

測試環境:

本次測試為.Net Windown 版本,下次再測試.Net Core Linux 版本。

Win11 系統:6核16G記憶體

Redis 版本:redis_version:3.2.100

由於單機測試,受執行程式和Redis自身程式等多綜合環境影響,測試結果僅供參考,用娛樂的心態看看即可。

測試程式碼:

見上一篇文章的測試程式碼:點選下載

CYQ.Data Redis 測試結果:

使用 CYQ.Data 當前最新版本:V5.9.2.7

VS2022 中直接執行 Release 版本:

直接執行編繹的exe程式結果:

StackExchange.Redis 測試結果:

使用 StackExchange.Redis 當前最新版本:V2.7.27

考慮到 StackExchange.Redis 預設是單執行緒,因此提前設定最低執行緒池,不然會拋異常。

 ThreadPool.SetMinThreads(128, 128);

VS2022 中直接執行 Release 版本:

執行編繹後程式 exe 結果:

redis-benchmark.exe 測試結果:

執行結果1:

執行結果2:

執行結果3:

執行結果4:

總結:

具體的效能指標,應該結合自身業務和生產環境,測試出適合自身要求的指標。

下面就來看看總結詞吧:

1、Redis 自帶測試工具

單執行緒時,能跑到2w/s,為啥6核下,最高也是6w/s出頭,而不是2W*6=12W呢?

Redis 是一個單執行緒的記憶體資料庫,它的效能受限於單個 CPU 核心的處理能力。即使在多核處理器上執行 Redis,它也只能利用其中一個核心進行處理,所以無法直接透過簡單地將單核效能乘以核心數來計算多核效能。

在一個六核處理器上執行 Redis,雖然有多個核心可供利用,但 Redis 本身仍然是單執行緒的,因此最高的吞吐量受限於單個核心的效能。雖然可以同時處理多個請求,但每個請求仍然只能在一個核心上依次執行,不能完全實現效能的線性增長。

此外,Redis 在處理請求時還會涉及到鎖競爭、執行緒切換等開銷,這些因素也會限制其在多核處理器上的效能表現。因此,儘管在多核處理器上執行 Redis 會比單核處理器有一定的效能提升,但不會達到簡單地將單核效能乘以核心數的增長幅度。

2、StackExchange.Redis 測試結果總結:

在VS2002中啟動執行時,單執行緒時,效能特別低,只有4000/s上下,這不禁讓我想起上一份測試的結果,是不是也是受這種執行模式影響。

在直接執行exe程式,單執行緒時,在1W/s左右,8執行緒下到5.2w/s出頭。

16執行緒之後,突飛猛進了,突破 Redis自身極限,達到10-20w/s ?

聽說StackExchange.Redis 從2.X 版本後,重構了程式碼,在資源管夠的情況下,將程式碼從單條提交序列轉批次提交,因此就有了這種測試結果。

3、CYQ.Data Redis 測試結果總結:

在VS中啟動執行,和直接執行啟動,兩者效能相差不大。

單執行緒時,在1.5w/s左右,多執行緒下到5.2w/s,效果基本穩定在5w/s上下。

整體 CYQ.Data Redis 表現是不錯的,常規呼叫效能比 StackExchange.Redis 高一些(去掉它雞賊的批次方式)。

目前 CYQ.Data 未提供批次方法呼叫,後續會考量,是否引入這種自動批次處理方式,或提供批次呼叫入口。

目前機制下,可以透過增加 Redis 服務數量來提升併發效能。

相關文章