ImcacheJava 緩存框架
Imcache是一個(gè)新的Java緩存庫包,它支持各種已應(yīng)用至今高速緩存模型。Imcache打算通過提供管理緩存數(shù)據(jù)的方法,以加快應(yīng)用程序。它提供了從小型應(yīng)用到大規(guī)模應(yīng)用解決方案。
支持堆外off-heap是其特點(diǎn),這大概是hazelcast和guava沒有的,而 Terrcotta BigMemory則是收費(fèi)的。堆外內(nèi)存突破JVM的內(nèi)存限制,而且不受垃圾機(jī)制影響。
BigMemory是用來避免GC對(duì)堆的開銷,從幾MB或GB大。 BigMemory通過直接的ByteBuffers使用JVM進(jìn)程的內(nèi)存地址空間,不像其他原生Java對(duì)象接受GC管束。
堆是內(nèi)存中動(dòng)態(tài)分配對(duì)象居住的地方。如果使用new一個(gè)對(duì)象,它就被分配在堆內(nèi)存上。這是相對(duì)于Stack,如果你有一個(gè)局部變量則它是位于Stack棧內(nèi)存空間。
EHCache的 off-heap將你的對(duì)象從堆中脫離出來序列化,然后存儲(chǔ)在一大塊內(nèi)存中,這就像它存儲(chǔ)到磁盤上上一樣,但它仍然在RAM中。對(duì)象在這種狀態(tài)下不能直接使用,它們必須首先反序列化。也不受垃圾收集。序列化和反序列化會(huì)影響性能。(FST-serialization還是很快)。
使用堆外內(nèi)存能夠降低GC導(dǎo)致的暫停。
應(yīng)用場(chǎng)景:
1.Session會(huì)話緩存,保存不激活的用戶session,比如用戶沒有正常退出,我們也無法確定他會(huì)不會(huì)短時(shí)間內(nèi)再回來,將其會(huì)話存到堆外內(nèi)存。一旦再次登錄,無需訪問數(shù)據(jù)庫可再次激活。
2.計(jì)算結(jié)果的緩存,大量查詢的結(jié)果等,擊中率比較低的都可以遷移到堆外。
maven依賴包:
<dependency> <groupId>com.cetsoft</groupId> <artifactId>imcache</artifactId> <version>0.1.0</version><!--Can be updated for later versions--> </dependency>
Imcache支持堆內(nèi)和堆外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);