Jive與Ofbiz的Cache機制比較 請大家討論
Jive與Ofbiz都用實現了Cache機制,兩者的原理都很類似,就是把所要快取的物件加到HashMap雜湊對映表中,用兩個連結串列分別維持著快取物件
和每個快取物件的生命週期。如果一個快取物件被訪問到,那麼就把它放到連結串列的最前面,然後不定時地把要快取的物件加入連結串列中,把過期
物件刪除,如此反覆。
在Jive(Jive2.6.0)中用到了Cache\Cacheable\CacheObject\CacheSizes\DefaultCache\LinkdList\LinkdListNode等類;
而在Ofbiz中,只用了一個類:UtilCache!!
在此比較一下他們的實現差異:
1、在Jive中有一個Cacheable介面,只有一個方法getCachedSize()
所有需要Cache的物件都必須implements該介面並實現getCachedSize(),其目的是為了在快取的時候得到物件的大小。
當呼叫DefaultCache中的put方法的時候,會得到該物件的大小:
而在Ofbiz中根本都不關心每個物件的Size,只關心總體的HashMap的Size,他的程式碼如下:
個人覺得,Ofbiz中處理得更簡潔,其實不就是判斷快取是否> maxSize嗎!用HashMap.Size()我覺得足以了,而且對於Jive的方式,每個需要
Cache的物件必須implements Cache介面,較麻煩。
當然是否有其他妙處就不得而知了,還請各位高人指點。
2、連結串列的問題也挺有意思,Jive為了實現雙向聯表用了兩個類:LinkdList\LinkdListNode,記錄最近訪問的物件列表和按時間順序排列的物件列表。
而在Ofbiz中用的是java.util.LinkedList:
public LinkedList keyLRUList = new LinkedList();
功能上好像也沒有什麼兩樣,不知道Jive問什麼還要如此破費周折?還請各位高人指點。
3、Ofbiz中物件過時清除功能寫得很一般,他是在get方法中實現的:
Jive中實現的就巧妙多了,而且在這上面寫得較精彩.
個人認為兩者實現的功能相當,Ofbiz程式碼更簡單,就是不知道兩者的效能究竟怎樣,請各位高人多多指教,請討論。
sailingyangjian@hoatmail.com
和每個快取物件的生命週期。如果一個快取物件被訪問到,那麼就把它放到連結串列的最前面,然後不定時地把要快取的物件加入連結串列中,把過期
物件刪除,如此反覆。
在Jive(Jive2.6.0)中用到了Cache\Cacheable\CacheObject\CacheSizes\DefaultCache\LinkdList\LinkdListNode等類;
而在Ofbiz中,只用了一個類:UtilCache!!
在此比較一下他們的實現差異:
1、在Jive中有一個Cacheable介面,只有一個方法getCachedSize()
public interface Cacheable extends Serializable { public int getCachedSize(); } <p class="indent"> |
所有需要Cache的物件都必須implements該介面並實現getCachedSize(),其目的是為了在快取的時候得到物件的大小。
當呼叫DefaultCache中的put方法的時候,會得到該物件的大小:
public synchronized Object put(Object key, Object value) { remove(key); int objectSize = calculateSize(value); if(maxCacheSize > 0 && (double)objectSize > (double)maxCacheSize * 0.9) { Log.warn("Cache: " + name + " -- object with key " + key + " is too large to fit in cache. Size is " + objectSize); return value; } else { cacheSize += objectSize; CacheObject cacheObject = new CacheObject(value, objectSize); map.put(key, cacheObject); LinkedListNode lastAccessedNode = lastAccessedList.addFirst(key); cacheObject.lastAccessedListNode = lastAccessedNode; LinkedListNode ageNode = ageList.addFirst(key); ageNode.timestamp = System.currentTimeMillis(); cacheObject.ageListNode = ageNode; cullCache(); return value; } } protected int calculateSize(Object object) { if(object instanceof Cacheable) return ((Cacheable)object).getCachedSize(); ...... } <p class="indent"> |
而在Ofbiz中根本都不關心每個物件的Size,只關心總體的HashMap的Size,他的程式碼如下:
public synchronized void put(Object key, Object value) { if (key == null) return; if (maxSize > 0) { // when maxSize is changed, the setter will take care of filling the LRU list if (cacheLineTable.containsKey(key)) { keyLRUList.remove(key); keyLRUList.addFirst(key); } else { keyLRUList.addFirst(key); } } if (expireTime > 0) { cacheLineTable.put(key, new UtilCache.CacheLine(value, useSoftReference, System.currentTimeMillis())); } else { cacheLineTable.put(key, new UtilCache.CacheLine(value, useSoftReference)); } if (maxSize > 0 && cacheLineTable.size() > maxSize) { Object lastKey = keyLRUList.getLast(); remove(lastKey); } } <p class="indent"> |
個人覺得,Ofbiz中處理得更簡潔,其實不就是判斷快取是否> maxSize嗎!用HashMap.Size()我覺得足以了,而且對於Jive的方式,每個需要
Cache的物件必須implements Cache介面,較麻煩。
當然是否有其他妙處就不得而知了,還請各位高人指點。
2、連結串列的問題也挺有意思,Jive為了實現雙向聯表用了兩個類:LinkdList\LinkdListNode,記錄最近訪問的物件列表和按時間順序排列的物件列表。
而在Ofbiz中用的是java.util.LinkedList:
public LinkedList keyLRUList = new LinkedList();
功能上好像也沒有什麼兩樣,不知道Jive問什麼還要如此破費周折?還請各位高人指點。
3、Ofbiz中物件過時清除功能寫得很一般,他是在get方法中實現的:
public Object get(Object key) { UtilCache.CacheLine line = (UtilCache.CacheLine) cacheLineTable.get(key); if (hasExpired(line)) {//如果過期 remove(key); line = null; } if (line == null) { // remove掉後還要告訴我過期!! missCount++; return null; } } <p class="indent"> |
Jive中實現的就巧妙多了,而且在這上面寫得較精彩.
個人認為兩者實現的功能相當,Ofbiz程式碼更簡單,就是不知道兩者的效能究竟怎樣,請各位高人多多指教,請討論。
sailingyangjian@hoatmail.com
相關文章
- 請教:jive論壇的同步機制
- Java快取機制:Ehcache與Guava Cache的比較Java快取Guava
- 大家討論一下比較好Criteria框架。框架
- 請教大家jive 與oracle的連線Oracle
- 關於Jive論壇中CACHE Hash機制的一個疑問
- 如何看原始碼?請大家討論原始碼
- 大家討論一下國內那些公司的JAVA技術比較牛把Java
- 同步機制比較
- failover機制的小討論AI
- HTTP請求的快取(Cache)機制HTTP快取
- 請問JIVE哪個版本比較適合學習用?
- 關於DAO的封裝,請板橋幫助,歡迎大家討論封裝
- oracle buffer cache管理機制_buffer cache dump與lru機制小記Oracle
- 討論免費OA系統哪個比較好
- 請問struts中如何實現分頁功能,有請大家踴躍討論
- 請大家推薦一個比較好的XML序列化工具!XML
- 請問Jive的緩衝機制是怎麼實現的?
- Synchronized和ReentrantLock鎖機制的比較synchronizedReentrantLock
- 【案例討論】災難與拯救 資料安全精彩案例大討論!歡迎大家踴躍參與!
- 討論:大家來討論一些連線涉及到的引數
- JDK 18 GC垃圾回收機制比較JDKGC
- 關於資料快取的機制,請大家指點!!快取
- Service Worker Cache 和 HTTP Cache 聯合使用的場景討論HTTP
- 請大家參與討論:如何用JBuilder7+JBoss3搭建最簡單的EJB釋出平臺?UIS3
- Java集合詳解3:Iterator,fail-fast機制與比較器JavaAIAST
- 簽名體制的比較
- 討論:關於The REBIND utility and the FLUSH PACKAGE CACHEPackage
- 黑客新聞網友討論比較IDEA與VsCode兩種開發工具黑客IdeaVSCode
- 請問 struts框架與其他 框架比較 的缺點框架
- 貧血和充血模型的比較之我見->有興趣的朋友進來參與討論模型
- 《Linux核心修煉之道》精華分享與討論(10)——模組機制與“Hello World!”薦Linux
- 虛擬機器與偵錯程式的討論虛擬機
- 《NewSQL與NoSQL的討論》SQL
- [全程建模]類圖與時序圖作用的對比討論時序圖
- Jive論壇與Spring框架Spring框架
- 關於jive開發論壇的一些討論-winCVS安裝(整理)
- 探討代理模式與Java反射機制的應用模式Java反射
- 《三》坐標x軸在兩種機制下的比較