横幅旋转器绑定到应用程序范围而不是数据库?

时间:2014-12-21 10:00:05

标签: mysql coldfusion cfml

我正在为我的coldfusion应用程序整理一个简单的横幅旋转器系统,虽然我对如何实现它有一个非常明确的想法,但我更关心解决方案的实际性能。

我在互联网上看到的所有解决方案都依赖于与底层数据库的持续交互(包括从数据库中提取recods'id-schuffling - 显示相应的横幅 - 增加点击/点击计数器并更新回数据库)。

考虑到我的网站每小时有一百个访问者,每个访问者平均访问10个页面,这意味着每小时有1000个读取和1000个更新数据库事务只显示广告横幅,即使读取的查询可以是容易缓存的更新不能。

我的问题是,将包含所有横幅的查询复制到APPLICATION范围内的新对象是否合理?考虑到您需要(偶尔)同步数据库似乎并不过分明显,因为可能的服务器重启之间缺乏应用程序范围持久性。

1 个答案:

答案 0 :(得分:1)

你正试图在盒子外思考是件好事。有时候最简单的不是什么是最好的。

像Matt Busche说的那样,我认为每小时2k查询的重量(每3.6秒只有2次)是一个很大的问题,但我想关注你在评论中所说的内容。

  

基本上,横幅广告应仅更新留下的展示次数和/或点击/点击计数器。 应用程序范围方法的一个明显缺点是,每次向数据库添加新横幅时都必须重新启动应用程序。

有很多方法可以避免在CF中这样做。我认为最实用的(如果你不是直接查询数据库),就是使用cfcache。

通知客户将在“接下来的X小时内”添加横幅,并使用CF提供的任何缓存方法来缓存内容,这是不合理的。

使用<cfcache>

<cfset cache_fresh = false>
<cfcache timespan="#createTimeSpan(0,12,0,0)#" ...> <!--- Timeout set to 12 hours --->
  <cfset cache_fresh = true>
  <cfif StructKeyExists(Application,"BannerObj")>
    object exists, update table.
  </cfif>
  Query table
  Update Application.BannerObj with new data.
</cfcache>

#cache_fresh#是一个变量,可用于查看缓存是否仅在此请求中创建。这些信息可能对您有用。

关于cfcache解决方案的一个好处是你可以通过刷新缓存强制更新,如果你想在每次添加横幅时更新系统或者有必须删除横幅的情况现在,例如,如果它违反了您的ToS。

使用应用范围变量..

<cflock name="upbanners" timeout="10">
  <cfif Application.ReGetData is true>
    Query for data and copy to application scope.
    <cfset Application.ReGetData = false>
  </cfif>
</cfif>

如果横幅系统未连续几天更新,则代码永远不会重新运行。您需要立即更新的所有内容都将ReGetData设置为true,对横幅系统的下一个请求将刷新对象。