是否可以解析ColdFusion 9.0.1缓存内存的内容?

时间:2012-03-16 23:37:37

标签: caching memory coldfusion cfcache

我已经盲目支持从CF8到9的变化,如果不创建自定义缓存或其他一些不值得付出努力的其他重要变通办法,就不再可能写入磁盘缓存。

此时我已经放弃尝试将应用程序转换为支持,如果可能的话,将高速缓存文件的内容写入静态cfm文件的方法相同。我现在更好奇,我已经深入挖掘它了。我正在寻找一个比我更有经验的人。

我想了解或知道如何处理模板缓存是:

  1. 能够在默认或自定义缓存中定位模板并刷新它而不清除整个缓存。
  2. 出于好奇或调试方法,查看或解析特定缓存模板的内容。
  3. 这是我使用的代码,需要CF 9.0.1,因为我认为由于添加了EhCache 2.0而在9.0中没有的一些缓存功能。

    <cftry>
            <cfcache action='serverCache' timeout='#CreateTimeSpan(0,0,0,10)#' stripwhitespace='true' 
                     usequerystring='true'>
                Stuff to cache.
                <br/>
                <cfoutput>#now()#</cfoutput>
                <br/>
            </cfcache>
    
            <!--- Get the cached contents --->
            <cfdump var="#cacheGetProperties()#">
            <cfdump var="#getAllTemplateCacheIds()#">
            <!---Locate a single cached item --->
            <cfscript>
                cacheArray = getAllTemplateCacheIds();
                WriteOutput("Before<br/>");
                for(i=1;i LTE ArrayLen(cacheArray);i=i+1)
                {
                    writeOutput(cacheArray[i] & "<br/>");
                    if(FindNoCase(scriptPath, cacheArray[i]))
                    {
                        //expect only to find min and max one per string so no need to worry about out of bounds
                        cacheIDSubStr =  REFind("[a-fA-F\d]{32}(?=_LINE:\d*$)",cacheArray[i],1,1);
                        cacheID = Mid(cacheArray[i],CacheIDSubStr.pos[1],CacheIDSubStr.len[1]);
                       //Failure to delete cache expected fireworks
                        //WriteOutput(cacheID&"<br/>");
                        //cacheObject = CacheGet(cacheID);
                        //CacheRemove(cacheID);
                        templateCache = cacheGetSession("template");
                          //Tooling around with the exposed guts of cacheGetSession
                        WriteDump(templateCache.getKeys());
                    }
                }
            </cfscript>
        <cfcatch type="Any">
    
            <cfscript>
                writeoutput("Error:" & cfcatch.message);
            </cfscript>
    
        </cfcatch>
        </cftry>
    

    不存在任何错误,但它是从原始版本编辑到此处发布的。

1 个答案:

答案 0 :(得分:1)

秘密在于CF 9.0.1函数cacheGetSession(),以及修改其他函数以key作为参数。

以下代码仅适用于9.0.1。

假设:

<cfcache action="serverCache" timeout="#CreateTimeSpan(0,0,0,10)#" stripwhitespace="true" usequerystring="true">
Stuff to cache in the default store.
<br/>
<cfoutput>#Now()#</cfoutput>
</cfcache>

<cfcache action="serverCache" key="myCustomCache" timeout="#CreateTimeSpan(0,0,0,10)#" stripwhitespace="true" usequerystring="true">
Stuff to cache in the 'myCustomCache' store.
<cfoutput>#Now()#</cfoutput>
</cfcache>

分别访问缓存的标识符

默认(模板):

<cfdump var=#getAllTemplateCacheIds()#>

myCustomCache:

<cfdump var=#cacheGetSession('myCustomCache',true).getKeys()#>

读取自定义缓存的数据

<cfset keys = cacheGetSession('myCustomCache',true).getKeys() />

<cfcache key="myCustomCache" action="get" name="dataInCache" id="#keys[1]#">

<cfdump var=#dataInCache#>

独立于默认

刷新自定义缓存
<cfset cacheRemove(keys[1],true,'myCustomCache')>

可悲的是,关于使用9.0.1的功能,文档并不是最好的。幸运的是,CF用户群擅长挖掘这些东西,即Rob-Brooks Bilson,他们在CF和一般缓存方面有很多很棒的文章。

一些警告你应该记住以这种方式使用缓存:

  1. 这些调用与引擎盖下的EhCache绑定,如果您尝试访问不存在的键,则可能返回NULL。将您的结果包含在IsNull()中以进行验证。

  2. cacheGetSession()具有误导性(正如Rob在他的博客上指出的那样),您可能认为您正在检索与应用程序相关的会话相关缓存数据,但这不是案例 - 它是服务器范围,您将在共享应用程序环境中看到其他缓存的密钥。

  3. 因此,请注意刷新相应的数据 ...