這里我們只關(guān)注緩存,Ignite的設(shè)計中引入了很多的計算平臺的能力,例如分布式計算和消息之類,在討論其他框架時不做比較。
Ignite和Redis的差異
Ignite源于H2數(shù)據(jù)庫,因此它的起點是個進(jìn)程內(nèi)緩存。但由于可以使用jdbc thin driver連接,加上它的集群特性,人們很容易把它當(dāng)作一個進(jìn)程外緩存去用,這是個誤區(qū)。
官網(wǎng)quickstart對于Pythin/node的使用場景,應(yīng)用使用thinclient的模式連接,這時候Ignite的作用和Redis就沒有什么差異,Ignite .Net/c++有點特殊,可以使用linq的能力作為節(jié)點加入進(jìn)來,也使用類似于java framework的完整能力,所以與其說Ignite是個中間件,不如說它是個framework。
數(shù)據(jù)結(jié)構(gòu)方面,Ignite的數(shù)據(jù)結(jié)構(gòu)比較簡單,沒有Redis豐富。
性能方面
Redis執(zhí)行g(shù)et的時間復(fù)雜度為O(1),和數(shù)據(jù)量大小無關(guān),當(dāng)數(shù)據(jù)量超過千萬級別時,對于get操作非常友好。
Ignite的B+樹結(jié)構(gòu)導(dǎo)致get的時間復(fù)雜度和樹高有關(guān),不是O(1),當(dāng)數(shù)據(jù)量較小時可以有不錯的性能,隨著數(shù)據(jù)量超過數(shù)百G時,get性能下降。但B+樹幫助Ingite在執(zhí)行query請求時,可以有較好的表現(xiàn),優(yōu)于redis的O(N)模式。
Ignite的進(jìn)程內(nèi)外的差別大約是10~20倍,需要注意適應(yīng)場景。
幾種場景下讀緩存的大致性能如下:
redis:
remote:
serialize object: avergae time span = 669075
iginite:
local:
binary object: avergae time span = 2869
serialize object: avergae time span = 6295
remote:
binary object: avergae time span = 73911
serialize object: avergae time span = 82019
Ignite和ECache/Caffeine的差異
Iginite的集群特性是它區(qū)別于ECache/Caffeine等進(jìn)程內(nèi)緩存框架的最大區(qū)別,當(dāng)我們需要對大型數(shù)據(jù)進(jìn)行分片存儲時會選擇Ignite。ECache/Caffeine框架的使用一般不開啟持久化,也不會產(chǎn)生序列化反序列化的計算,而Ignite由于是分布式框架,序列化是必備的能力。
合理選擇緩存方式
Ignite最適用的場景是網(wǎng)格計算,特點是大規(guī)模的集群節(jié)點,節(jié)點需要高速的讀緩存訪問,且緩存的數(shù)據(jù)分布可以有一定的黏性(affinity)。由于數(shù)據(jù)分布有黏性,節(jié)點間數(shù)據(jù)在寫入時需要一定的復(fù)制分發(fā)機(jī)制。
Ignite操作的對象往往需要按照class定義進(jìn)行對象的序列化和反序列化操作,表達(dá)式求值,因此適用的場景以進(jìn)程內(nèi)操作為主,否則對應(yīng)的bean需要被部署到其它節(jié)點上。具體做法是將實體類打包成普通jar包,并放在$IGNITE_HOME/libs/路徑下面。注意:打包的時候不能打包成spring-boot的可執(zhí)行包,要打包成普通jar包,這樣相關(guān)類才能正常加載。當(dāng)然如果集群里的節(jié)點均為應(yīng)用節(jié)點,則可以不用考慮這個問題。
從上面可以看到Ignite的場景是比較專用的,很少作為通用緩存適用。