使用缓存或应用程序范围创建命中计数器

| 我想为我的ColdFusion应用程序创建一个计数器。我不希望每次点击时都更新数据库点击表。理想情况下,我想在应用程序范围内或某些类型的结构中汇总缓存,然后间歇性地保存它们。 到目前为止,我有一些想法: 想法1 创建一个应用程序或缓存结构以存储pageId和pageHits键值对。 在每次点击的网页上,检查是否存在pageId / ip地址cookie。 一种。如果存在,则什么也不做。 b。如果没有,请进行设置并更新应用或缓存中的匹配结构。 问题:我不知道如何将结构数据间歇性地/在经过一定时间后进入数据库。预定活动? 想法2 没有饼干;将pageId / ip地址保存在自己的缓存/应用结构中。 问题我不确定如何构造数据结构/数组来存储信息。似乎复杂于数组循环和结构查找。而且我仍然遇到与想法一相同的问题。 有什么建议,想法,批评吗?特别是,我需要一些帮助来确定想法2的数据结构。我对性能比对数据完整性更感兴趣,并且对仅CF9解决方案感到满意。我应该补充一点,我希望将每个页面ID的数据归一化到页面点击列中。我不需要标准化的数据表。     
已邀请:
        尝试以您描述的方式捕获数据会带来缓存过期的伸缩性问题,以避免当您最终要保留到数据库时,随着条目数的增加,OOM或迭代时间较长。您要聚合的信息已捕获在Web服务器日志中。解析这些是一项简单的活动,您只需要编写一种算法即可了解这些过渡的方式和时间。 使用
log = fileRead(\'log.txt\', \'read\')
,并定期通过
<cfschedule/>
遍历over1ѭ。对于每一批,您都可以按照已经描述的方式,然后根据IP地址使用任何数据库方法进行INSERT / UPDATE(通常使用MERGE关键字,但是MySQL是不同的),基于IP地址后。如果这是一个非常繁忙的站点,请考虑将IP地址列的数据类型更改为整数数据类型以加快索引查找的速度。 更新资料 使用以下代码来设置文件对象引用:
<cflock name=\"logparser\" type=\"exclusive\" timeout=\"1\" throwontimeout=\"false\">
    <cfif NOT structKeyExists(application, \"logFile\")>
        <cfset application.logFile =
            fileOpen(\'/path/to/log.txt\', \'read\')>
    </cfif>
    <cfloop condition=\"NOT FileisEOF(application.logFile)\">
        <!--- replace with an appropriate algorithm --->
        <cfoutput>
            #fileReadLine(application.logFile)#
            <br />
        </cfoutput>
    </cfloop>
</cflock>
这样做会设置一次参考(即
fileOpen()
),从而跟踪其所在的行。然后,当
<cfschedule/>
再次点击此代码时,它将使用现有的引用(如果存在)并从那里进行迭代。该锁可确保只有一个线程执行该算法-因此您不必担心时间限制,只需让它持续运行即可。     
        想法1:是的,
<cfschedule>
是您的朋友 想法2:保存pageId / ip地址?我猜这比使用Java中的Set更好,但是如果将其赋值为空值,struct也可以工作...
pageIDs[\"1\"][\"192.0.0.1\"] = \"\";
hitsOfPage1 = structCount(pageIDs[1]));
但是,如果我再次访问tmr页面,我将不会被计数?     

要回复问题请先登录注册