Architecture 使用缓存或应用程序作用域创建命中计数器

Architecture 使用缓存或应用程序作用域创建命中计数器,architecture,coldfusion,coldfusion-9,hit,Architecture,Coldfusion,Coldfusion 9,Hit,我想为我的ColdFusion应用程序创建一个点击计数器。我不想在每次点击页面时更新数据库点击表。理想情况下,我希望聚合应用程序范围中的命中,或某种类型的结构中的缓存,然后间歇性地保存它们 到目前为止,我还没有找到我的想法 想法1 创建应用程序或缓存结构以存储pageId和pageHits键值对 在每次点击页面时,检查是否存在pageId/ip地址cookie a。如果它存在,什么也不做 b。如果没有,则将其设置并更新应用程序或缓存中的hits结构 问题:我不知道如何间歇性地/在经过一定时间后将

我想为我的ColdFusion应用程序创建一个点击计数器。我不想在每次点击页面时更新数据库点击表。理想情况下,我希望聚合应用程序范围中的命中,或某种类型的结构中的缓存,然后间歇性地保存它们

到目前为止,我还没有找到我的想法

想法1

  • 创建应用程序或缓存结构以存储pageId和pageHits键值对
  • 在每次点击页面时,检查是否存在pageId/ip地址cookie
  • a。如果它存在,什么也不做
  • b。如果没有,则将其设置并更新应用程序或缓存中的hits结构
  • 问题:我不知道如何间歇性地/在经过一定时间后将结构数据放入数据库。预定的活动

    创意2

    没有饼干;将pageId/ip地址保存在他们自己的缓存/应用程序结构中

    问题我不确定如何构造数据结构/数组来存储信息。数组循环和结构查找似乎很复杂。我还有和第一个想法一样的问题

    有什么建议、想法、批评吗?特别是,我需要一些帮助来找出idea 2的数据结构。我对性能比对数据完整性更感兴趣,并且对仅CF9的解决方案感到满意我应该为每个页面id添加一个非规范化数据到页面点击列中。我不需要规范化数据表。想法1:是的,
    是你的朋友

    想法2:保存pageId/ip地址?我想最好使用Java中的Set,但若你们给它赋一个空值,struct也能工作

    pageIDs["1"]["192.0.0.1"] = "";
    hitsOfPage1 = structCount(pageIDs[1]));
    

    但是,如果我再次访问tmr页面,我将不会被计算在内?

    尝试以您描述的方式捕获此数据会带来缓存过期的缩放问题,以避免在您最终希望持久化到数据库时,随着条目数目的增加而出现OOM或长时间的迭代。要聚合的信息已在web服务器日志中捕获。解析这些是一个简单的活动,您只需要编写一个算法,了解这些滚动的方式和时间

    使用
    log=fileRead('log.txt','read')
    并通过
    定期迭代
    行fileReadLine(log)
    。对于每个批次,您可以按照前面描述的方式,然后使用基于IP地址的任何内容(如果您想要的话)。如果它是一个非常高的流量站点,请考虑更改< /P>的数据类型。 更新

    使用以下代码设置文件对象引用:

    <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>
    
    
    #fileReadLine(application.logFile)#
    

    执行此操作将设置引用一次(即
    fileOpen()
    ),以跟踪它所在的行。然后,当
    再次点击此代码时,它将使用现有的引用(如果存在),并从那里向前迭代。锁确保只有一个线程执行该算法——因此您不必担心时间限制,只要它需要,就让它继续运行

    为什么我不做一些像点击[1]这样的事情呢?在这种情况下,我很难可视化数据的结构!另外,在cookie场景中,我可以让它在几个小时后过期。在第二个想法中,我还不知道它是如何工作的。因为你想要的关于计数器的最常见的答案是。。。pageID=X的点击率有多少。您需要一个支持这一点的数据结构。您指定的数据结构无法轻松回答“where pageId=1”部分。感谢您澄清此问题。有一件事我忘了提:我将把命中数据反规范化为一个页面命中列,因为页面本身保存在数据库中):如果我每60秒运行一次此服务,日志文件变得非常大,我如何只读取60秒的日志行?如果我的日志文件有10000行,但我只需要在过去60秒内创建的行。。。这种方法是否切实可行?我不是在寻找标准化的数据。@Mohamad:查看我的更新。简短的回答是,不要担心时间限制,而是使用
    fileOpen()
    引用。我还没有开始实现它,但我会在这个周末尝试一下。不过,今天早上我在想,我突然想到:你将如何追踪独特的点击率!如果每个访问者在3小时后都算作唯一点击,那么算法必须解析每一行,并计算出上一个x时间是否有重复值。。这是否可行?@Mohamad:我可能会把每一次点击都放入一个数据库表中,包括IP地址、URL和时间戳。然后在这些行上运行DISTINCT,并使用WHERE子句约束时间段。这会给你你想要的信息。