2010-11-04 87 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

相关问题