1

我有一个系统正在运行Coldfusion8/MySQL 5.0.88

在某些页面上,我需要根据(登录)用户预查询参数。例如,该网站有一个产品搜索,它只允许搜索授权用户的卖家的产品(allow-list)。

现在,当用户进入产品页面时,我正在构建allow-list显示卖家。当用户触发产品搜索时,我调用 search.cfc,它再次构建allow-list执行搜索。在另一个页面上,用户可以锁定/解锁卖家,因此列表可能会定期更改。

问题:
我是否应该将其存储allow-list到 Session 以使其随处可用,而不必一直重新查询数据库?该列表可能很长(13 位 ID,逗号分隔)。我是否需要一个Session.rebuild = true/false参数来指示何时重建而不采用当前的 Session 值(更新后)。如果查询相同但在单独的页面上,查询缓存是否也有意义?

谢谢你的一些想法。

4

2 回答 2

2

As long as the values stored in the session are not the security that protects them, that's fine.

Query caching is based on the query being sent to the server, if it is identical it should not even touch the db, but get it from memory, effectively doing what your suggesting.

于 2012-08-02T13:36:57.400 回答
2

选择保存缓存的位置很大程度上取决于您希望系统执行的操作。

您不想缓存数据超过有用的时间,因此将其放在 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>
于 2012-08-02T15:22:20.883 回答