亚洲全黄无码一级在线看_国产剧情久久久性色_无码av一区二区三区无码_亚洲成a×人片在线观看

當(dāng)前位置: 首頁 > 科技新聞 >

萬萬沒想到,Redis多線程版本竟然比原生版本快那

時間:2019-11-12 19:32來源:網(wǎng)絡(luò)整理 瀏覽:
如果我告訴您有一個 Redis 的分支版本,它的性能比原生的 Redis 快 5 倍,而且延遲卻降低近 5 倍,你會不會想了解一下這個項目

如果我告訴您有一個 Redis 的分支版本,它的性能比原生的 Redis 快 5 倍,而且延遲卻降低近 5 倍,你會不會想了解一下這個項目?而如果您不再需要哨兵節(jié)點并且您的副本可以接受讀取和寫入,這將有可能使分片數(shù)量減少 10 倍,這樣對你的吸引力是不是更大了呢?

萬萬沒想到,Redis多線程版本竟然比原生版本快那么多

我說的這個分支版本,它其實是 Redis 的一個分叉版本,名叫 KeyDB 。KeyDB 是 Redis 開源的多線程分叉版本。本文我們將提供最新的基準(zhǔn)測試結(jié)果,并討論更強(qiáng)大的 KeyDB 實例如何減少集群大小以及簡化堆棧。同時我們還將討論了多線程體系結(jié)構(gòu),并演練了如何利用它實現(xiàn)性能的提升。

為什么要取個新名字,為什么要做 Redis 的分叉?

憑借著我們不受限制的代碼庫開發(fā)能力,KeyDB 能夠在短時間內(nèi)取得長足的進(jìn)步,并且所走的道路將在未來幾個月內(nèi)破壞整個數(shù)據(jù)庫格局。

關(guān)于為什么首先搞一個 Redis 分叉的原因,這是因為 KeyDB 和 Redis 在如何發(fā)展方面有不同的理念。我們認(rèn)為易用性、高性能和“內(nèi)置動力”的方法是創(chuàng)造良好用戶體驗的最佳方法。盡管我們非常尊重 Redis 維護(hù)者,但我們認(rèn)為 Redis 的方法過于注重代碼的簡單性,而以犧牲用戶的便利性為代價。這導(dǎo)致經(jīng)常需要借助外部組件和方案來解決很多常見問題。

由于存在意見分歧,因此適合 KeyDB 的功能可能不適用于 Redis。而做一個新的分叉版本可以允許我們探索這一新的開發(fā)路徑并實現(xiàn)可能永遠(yuǎn)不會成為 Redis 一部分的功能。KeyDB 將與上游的 Redis 代碼變更保持同步,在適用的情況下,我們還給 Redis 提交錯誤修復(fù)和改進(jìn)。我們希望這兩個項目能夠繼續(xù)發(fā)展并相互學(xué)習(xí)。

最新基準(zhǔn)數(shù)據(jù)

KeyDB 于今年3月推出,盡管我們的性能有所提高,但我們?nèi)匀幌M芨斓匕l(fā)展。我們最新的基準(zhǔn)測試數(shù)據(jù)顯示,KeyDB的單個實例的每秒操作數(shù)(圖范圍為53-5.49)比Redis(v5)的單個實例多5倍以上,而延遲(圖形范圍為4.6-5.1)近5倍:

萬萬沒想到,Redis多線程版本竟然比原生版本快那么多
萬萬沒想到,Redis多線程版本竟然比原生版本快那么多

多線程的優(yōu)勢

增加 KeyDB 的單個實例/節(jié)點的功能可以減少分片的需要,并且可以大大減少數(shù)據(jù)移動的數(shù)量。您可能會問,與在單個節(jié)點上多線程化相比,在群集中運行許多Redis 節(jié)點是否可以獲得比單線程多線程更多的吞吐量?您可以像 Redis 一樣對 KeyDB 進(jìn)行分片,這對數(shù)據(jù)庫進(jìn)行水平擴(kuò)展很有意義。但是,如果您可以選擇增加馬力而不購買第二輛車,那為什么不呢?除分片外,還能夠擴(kuò)展節(jié)點的大小,為用戶增加了新的功能和選擇。這是 Redis 與 KeyDB 之間意見分歧的其中之一。這不僅是社區(qū)中的常見討論點,還是某些圈子中的爭論點。

因此,為了回答 “用 KeyDB 運行更多線程看起來像什么?” 這個問題,我們提供了一些基本數(shù)字,以便您對此問題有所了解。

以下是基準(zhǔn)測試(操作/秒)與使用的線程數(shù)對應(yīng)關(guān)系的圖表:

萬萬沒想到,Redis多線程版本竟然比原生版本快那么多

隨著分配更多資源給實例,您可以看到性能得到大幅提高。同時還可以可以將線程固定到某個CPU上以得到進(jìn)一步的提升,但最適合您的選擇可能取決于您的設(shè)置。默認(rèn)情況下,此選項是禁用的。

僅將一個線程分配給KeyDB,平均而言,與 Redis 的單個線程實例相比,它仍可保持約5%的性能提升。因此,即使添加了新功能并更改了體系結(jié)構(gòu),性能也沒有受到影響。

多線程架構(gòu)

KeyDB 通過在多個線程上運行常規(guī)的 Redis 事件循環(huán)來工作。網(wǎng)絡(luò) IO 和查詢解析是同時進(jìn)行的。每個連接在 accept() 上分配一個線程。自旋鎖保護(hù)對核心哈希表的訪問。因為哈希表訪問非???,所以此鎖的爭用較低。事務(wù)在EXEC命令的持續(xù)時間內(nèi)保持鎖定。模塊與GIL協(xié)同工作,而GIL僅在所有服務(wù)器線程都暫停時才獲取。這保持了模塊期望的原子性保證。

與大多數(shù)數(shù)據(jù)庫不同,核心數(shù)據(jù)結(jié)構(gòu)是系統(tǒng)中最快的部分。查詢的大部分時間來自解析REPL協(xié)議并將數(shù)據(jù)復(fù)制到網(wǎng)絡(luò)或從網(wǎng)絡(luò)復(fù)制數(shù)據(jù)。

未來的工作包括允許在連接之后重新平衡與不同線程的連接,并允許多個讀取器同時訪問哈希表

進(jìn)一步優(yōu)化設(shè)置

此外,KeyDB 還提供了一些有助于簡化用戶體驗的功能。例如活動副本功能已在最新的穩(wěn)定版本 5 中廣泛采用并在生產(chǎn)中使用。此功能使您能夠在兩個主節(jié)點彼此復(fù)制,同時接受讀取和寫入操作。而且不需要哨點節(jié)點來控制故障轉(zhuǎn)移。您將獲得很高的可用性,同時最大限度地利用資源。如果尚未平衡對副本節(jié)點的讀取,則可以使用此選項將吞吐量提高一倍。這意味著從簡單的 Redis 主副本設(shè)置轉(zhuǎn)移到使用 KeyDB 的多線程活動副本設(shè)置,可以將分片需求減少多達(dá)10倍。

【責(zé)任編輯:武曉燕 TEL:(010)68476606】
推薦內(nèi)容