Imcache是一个新的Java缓存库包,它支持各种已应用至今高速缓存模型。Imcache打算通过提供管理缓存数据的方法,以加快应用程序。它提供了从小型应用到大规模应用解决方案。
支持堆外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.计算结果的缓存,大量查询的结果等,击中率比较低的都可以迁移到堆外。
maven依赖包:
<dependency> <groupId>com.cetsoft</groupId> <artifactId>imcache</artifactId> <version>0.1.0</version><!--Can be updated for later versions--> </dependency>
Imcache支持堆内和堆外off-heap 缓存,也将支持分布式缓存。 使用方式:
Cache<String,User> cache = CacheBuilder.heapCache(). cacheLoader(new CacheLoader<String, User>() { public User load(String key) { return userDAO.get(key); } }).evictionListener(new EvictionListener<String, User>{ public onEviction(String key, User user){ userDAO.save(key, user); } }).capacity(10000).build(); //If there is not a user in the heap cache it'll be loaded via userDAO. User user = cache.get("#unique identifier"); User newUser = new User("email", "Richard", "Murray") //When maximum value for cache size is reached, eviction event occurs. //In case of eviction, newUser will be saved to db. cache.put(newUser.getEmail(), newUser);