您好我使用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?
想知道如何最好地解决这个问题
由于
答案 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)或每个请求上检查它。