2010-11-04 38 views
2

我知道我可以使用的ColdFusion緩存API來清除數據,例如:使用cacheGetSession對象清除自定義緩存有更快的方法嗎?

<cfset cacheName = "custom"> 
<cfset ids = cacheGetAllIds(cacheName)> 
<cfset cacheRemove(arrayToList(ids), false, cacheName)> 

但在實踐中檢索所有的ID(即cacheGetAllIds())做刪除慢(例如秒)。我在想如果我完全開始以毫秒爲單位發生這種情況,應該有辦法。在我的特殊情況下,自定義緩存是磁盤持久性的,磁盤上可能是100兆字節。

我懷疑有一種更快的方法來使用cacheGetSession()上的方法來清除這個問題,或許可以結合ColdFusion API。因此,詢問是否有人知道如何做到這一點,使ColdFusion同時開心,然後我開始在自己的引擎蓋下查看。

更新

看起來有可能使用cacheGetSession(cacheName,真).removeAll(),因爲返回的對象是net.sf.ehcache.Cache類型,它實現net.sf.ehcache.Ehcache的。這個接口指定了一個方法removeAll()。儘管如此,還沒有嘗試過。

回答

3

該做的:

cacheGetSession(cacheName, true).removeAll() 

擁有約10K +記錄在60毫秒返回。

FYI:cachGetSession()是一個ColdFusion 9.0.1功能

1

我還沒有測試過這個,但這是否更快?以防萬一ArrayToList()是瓶頸。

<cfloop index="cache" array="#cacheGetAllIds(cacheName)#"> 
    <cfset cacheRemove(cache, false, cacheName)> 
</cfloop> 

參考:http://www.aaronwest.net/blog/index.cfm/2009/11/28/14-Days-of-ColdFusion-9-Caching-Day-12--Removing-All-Items-in-Cache

如果性能是真的對你的問題,提交錯誤報告? http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html

+0

cacheGetAllIds()是瓶頸 - 事實上,如果你看一下緩存對象的API文檔getKeys()它描述的算法進行檢索的O (n)爲每1000個條目8ms,我看到的速度較慢 - 對於10,000個條目,2000ms +。 – orangepips 2010-11-04 21:29:02

+1

會設置cacheSetProperties({maxElementsInMemory = 0,cacheName)然後將其恢復到大小工作? – Henry 2010-11-04 23:19:58

+0

對於設置屬性有趣的想法+1。 – orangepips 2010-11-05 19:00:09

相關問題