在ColdFusion中使用缓存对Api进行速率限制调用

时间:2010-04-26 09:12:44

标签: api coldfusion last.fm application.cfc rate-limiting

您好我使用ColdFusion来调用last.fm api,使用来自here的cfc包。

我担心会超过请求限制,即每秒发送一次IP地址的5个请求,平均为5分钟。

cfc软件包有一个中央组件,可调用所有其他组件,这些组件分为“艺术家”,“轨道”等部分......这个中心组件“lastFmApi.cfc”。在我的应用程序中启动,并持续应用程序的生命周期

// Application.cfc example
    <cffunction name="onApplicationStart">
        <cfset var apiKey = '[your api key here]' />
        <cfset var apiSecret = '[your api secret here]' />

        <cfset application.lastFm = CreateObject('component', 'org.FrankFusion.lastFm.lastFmApi').init(apiKey, apiSecret) />
    </cffunction>

现在,如果我想通过处理程序/控制器调用api,例如我的艺术家处理程序......我可以这样做

<cffunction name="artistPage" cache="5 mins">
 <cfset qAlbums = application.lastFm.user.getArtist(url.artistName) />
</cffunction>

我对缓存感到有些困惑,但我在这个处理程序中缓存每次调用api 5分钟,但这有什么不同,因为每次有人点击新的艺术家页面时,这仍然算作新鲜点击反对api?

想知道如何最好地解决这个问题

由于

2 个答案:

答案 0 :(得分:3)

因为它是简单的数据模型,所以我不会使用自定义缓存引擎复杂化。我把简单的struct / query:searchTerm / result,timestamp放在某个地方。你可以这样做:

<cffunction name="artistPage" cache="5 mins">
    <cfargument name="artistName" type="string" required="true"/>
    <cfif structKeyExists(application.artistCache, arguments.artistName) and structfindkey(application.artistCache, arguments.artistName)>
        <cfif (gettickcount() - application.artistCache[arguments.artistName].timestamp ) lte 5000 >

        <cfset result = application.artistCache[arguments.artistName].result >
    <cfelse>
        <cfset qAlbums = application.lastFm.user.getArtist(arguments.artistName) />
        <cfset tempStruct = structnew()>
        <cfset structNew.result = qAlbums >
        <cfset structNew.timestamp = getTickCount() >
        <cfset structInsert(application.artistCache, arguments.artistName, tempstruct, true) >

        <cfset result = qAlbums >

    </cfif>

    <cfreturn result >
</cffunction>

编辑:是的,你应该放置一个方法来删除结构密钥,其中时间戳差异是你的缓存有效期。

建议使用外观图案,以便将来更改。

抱歉打字错误:)

答案 1 :(得分:0)

我会尝试自定义缓存。

它可以是一个结构,其中键是艺术家名称或您的条目的其他唯一标识符。

如果您使用的是CF9或Railo 3.1.2+,您可以使用内置缓存(函数CachePut,CacheGet等),它可以为您处理超时和内容。

否则,您可以将缓存存储到应用程序范围中,但需要在每个条目中包含时间戳,并在缓存事件(get / put / remove)或每个请求上检查它。