选择保存缓存的位置很大程度上取决于您希望系统执行的操作。
您不想缓存数据超过有用的时间,因此将其放在 Session 范围内是好的,因为只要用户处于活动状态,它就会被缓存。此外,如果卖家不在乎买家是否从那时起购买了一些东西,即使他们最近被删除了,那么您永远不需要更新缓存,只需等待它过期即可。
或者,您可以依赖 ColdFusion 的内置查询缓存。您可以提供一个您希望大多数用户在网站上处于活动状态的时间范围,并且您可以使用少量代码轻松更新缓存。根据您的观点,一个可能的缺点或优点是服务器上有固定数量的缓存查询,如果超过缓存查询的数量,它将为您刷新缓存。这提供了某种程度的内存管理,但可能会重新获取您希望保持缓存的查询。
这是处理查询缓存的一种方法。这将缓存查询,直到时间跨度过去;缓存的结果将作为超出清除的最大缓存查询的一部分或基于代码的整个查询缓存的刷新的一部分被删除。
<cffunction name="getData" access="public" output="false" returntype="string" hint="Returns a hash of the supplied string.">
<cfargument name="Id" type="numeric" required="true">
<cfargument name="ClearCache" type="boolean" default="false" required="false">
<!--- Long cache the query since the values rarely change, but allow the cache to be cleared. --->
<cfif Arguments.ClearCache EQ false>
<cfset local.CachedWithin = CreateTimeSpan(0,0,10,0)>
<cfelse>
<cfset local.CachedWithin = CreateTimeSpan(0,0,0,-1)>
</cfif>
<!--- Run the query --->
<cfquery name="local.qryGetData" datasource="#Variables.DSN#" cachedwithin="#local.CachedWithin#">
...
</cfquery>
<cfreturn local.qryGetData>
</cffunction>
然后,您可以在更新后运行一个函数来清除相关的缓存查询。
<cffunction name="clearCache" access="public" output="false" returntype="void">
<cfargument name="Id" type="numeric" required="true">
<cfset Variables.getData(Id=Arguments.Id, ClearCache=true)>
<cfset Variables.getSomethingElse(Id=Arguments.Id, ClearCache=true)>
</cffunction>