Imcache :一个Java新的缓存框架

Imcache是一个新的Java缓存库包,它支持各种已应用至今高速缓存模型。Imcache打算通过提供管理缓存数据的方法,以加快应用程序。它提供了从小型应用到大规模应用解决方案。

maven依赖包:


<dependency>
<groupId>com.cetsoft</groupId>
<artifactId>imcache</artifactId>
<version>0.0.8</version><!--Can be updated for later versions-->
</dependency>

Imcache支持堆内和堆外off-heap 缓存,也将支持分布式缓存。

使用方式:


void example(){
Cache<Integer,Integer> cache = CacheBuilder.heapCache().
cacheLoader(new CacheLoader<Integer, Integer>() {
public Integer load(Integer key) {
return null;
}
}).capacity(10000).build();

cache.put(10,10);
cache.get(10);
}

源码库包下载:GitHub

这个hazelcast相比,有何优势?

这个跟guava中的cache很类似啊!

支持堆外off-heap是其特点,这大概是hazelcast和guava没有的,而 Terrcotta BigMemory则是收费的。堆外内存突破JVM的内存限制,而且不受垃圾机制影响。

BigMemory是用来避免GC对堆的开销,从几MB或GB大。 BigMemory通过直接的ByteBuffers使用JVM进程的内存地址空间,不像其他原生Java对象接受GC管束。


堆是内存中动态分配对象居住的地方。如果使用new一个对象,它就被分配在堆内存上。这是相对于Stack,如果你有一个局部变量则它是位于Stack栈内存空间。

EHCache的 off-heap将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化。也不受垃圾收集。序列化和反序列化会影响性能。(FST-serialization还是很快)。

使用堆外内存能够降低GC导致的暂停。

应用场景:
1.Session会话缓存,保存不激活的用户session,比如用户没有正常退出,我们也无法确定他会不会短时间内再回来,将其会话存到堆外内存。一旦再次登录,无需访问数据库可再次激活。

2.计算结果的缓存,大量查询的结果等,击中率比较低的都可以迁移到堆外。

由于可以使用堆外内存,是否可以考虑将CQRS的Im-Memory部分采用imcache来代替redis来实现呢,如果不考虑redis提供的其他额外机制的话...