Ignite的使用场景

2022-08-07  本文已影响0人  goxplanet

这里我们只关注缓存,Ignite的设计中引入了很多的计算平台的能力,例如分布式计算和消息之类,在讨论其他框架时不做比较。

Ignite和Redis的差异

Ignite源于H2数据库,因此它的起点是个进程内缓存。但由于可以使用jdbc thin driver连接,加上它的集群特性,人们很容易把它当作一个进程外缓存去用,这是个误区。
官网quickstart对于Pythin/node的使用场景,应用使用thinclient的模式连接,这时候Ignite的作用和Redis就没有什么差异,Ignite .Net/c++有点特殊,可以使用linq的能力作为节点加入进来,也使用类似于java framework的完整能力,所以与其说Ignite是个中间件,不如说它是个framework。
数据结构方面,Ignite的数据结构比较简单,没有Redis丰富。

性能方面
Redis执行get的时间复杂度为O(1),和数据量大小无关,当数据量超过千万级别时,对于get操作非常友好。
Ignite的B+树结构导致get的时间复杂度和树高有关,不是O(1),当数据量较小时可以有不错的性能,随着数据量超过数百G时,get性能下降。但B+树帮助Ingite在执行query请求时,可以有较好的表现,优于redis的O(N)模式。
Ignite的进程内外的差别大约是10~20倍,需要注意适应场景。
几种场景下读缓存的大致性能如下:

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的集群特性是它区别于ECache/Caffeine等进程内缓存框架的最大区别,当我们需要对大型数据进行分片存储时会选择Ignite。ECache/Caffeine框架的使用一般不开启持久化,也不会产生序列化反序列化的计算,而Ignite由于是分布式框架,序列化是必备的能力。

合理选择缓存方式

Ignite最适用的场景是网格计算,特点是大规模的集群节点,节点需要高速的读缓存访问,且缓存的数据分布可以有一定的黏性(affinity)。由于数据分布有黏性,节点间数据在写入时需要一定的复制分发机制。
Ignite操作的对象往往需要按照class定义进行对象的序列化和反序列化操作,表达式求值,因此适用的场景以进程内操作为主,否则对应的bean需要被部署到其它节点上。具体做法是将实体类打包成普通jar包,并放在$IGNITE_HOME/libs/路径下面。注意:打包的时候不能打包成spring-boot的可执行包,要打包成普通jar包,这样相关类才能正常加载。当然如果集群里的节点均为应用节点,则可以不用考虑这个问题。

从上面可以看到Ignite的场景是比较专用的,很少作为通用缓存适用。

上一篇下一篇

猜你喜欢

热点阅读