Pregunta

Hola estoy usando ColdFusion para llamar a la API de last.fm, utilizando un haz de CFC procedente de aquí .

Me preocupa sobrepasar el límite solicitud, que es de 5 por dirección IP de origen por segundo, promediada sobre un periodo de 5 minutos.

El paquete de CFC tiene un componente central que llama a todos los demás componentes, los cuales están divididos en secciones como "artista", "seguimiento" etc ... Este componente central "lastFmApi.cfc." se inicia en mi solicitud, y persistió durante la vida útil de la aplicación

// 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>

Ahora si quiero llamar a la API a través de un controlador / controlador, por ejemplo, mi manejador artista ... Puedo hacer esto

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

Estoy un poco confundido hacia el almacenamiento en caché, pero estoy almacenamiento en caché de cada llamada a la API en este manejador durante 5 minutos, pero ¿Esto hace ninguna diferencia, ya que cada vez que alguien realiza un nueva página del artista planteo esto todavía supone un blanco fresco en contra de la API?

Se pregunta cuál es la mejor para hacer frente a este

Gracias

¿Fue útil?

Solución

Desde su sencillo modelo de datos que había no complicar las cosas con motores de caché personalizado. Yo pondría estructura sencilla / consulta: searchTerm / resultado, en alguna marca de tiempo. Allí usted puede hacer esto:

<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>

EDIT:. Sí, se debe poner en algún lugar también el método que eliminaría teclas struct donde la diferencia es de marca de tiempo gt entonces su período de validez caché

patrón

Fachada se recomienda con el fin de hacer que esto puede cambiar en el futuro.

Lo siento por los errores tipográficos:)

Otros consejos

Me gustaría probar la memoria caché personalizado.

Puede ser una estructura en la que las claves son los nombres de artistas u otros identificadores únicos de sus entradas.

Si está utilizando CF9 o Railo 3.1.2+ se puede utilizar una función de almacenamiento en caché (funciones CachePut, CacheGet etc.), se puede manejar para que los tiempos de espera y otras cosas.

De lo contrario, puede almacenar la memoria caché en el ámbito de aplicación, pero tendrá que incluir fecha y hora con cada entrada y comprobar que en los eventos de caché (obtener / poner / quitar) o incluso en cada solicitud.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top