Ограничение уровня звонит в API Используя кэш в ColdFusion

Привет я использую ColdFusion для вызова API Last.fm, с помощью пакета cfc, полученного отсюда.

Я обеспокоен осмотром через предел запроса, который является 5 запросами на возникновение IP-адреса в секунду, усредненный за 5-минутный период.

Пакет cfc имеет центральный компонент, который называет все другие компоненты, которые разделены на разделы как "художник", "отслеживают" и т.д... Этот центральный компонент "lastFmApi.cfc". инициируется в моем приложении и сохраняется для продолжительности жизни приложения

// Application.cfc example
    
        
        

        
    

Теперь, если я хочу назвать API через обработчик/контроллер, например, мой обработчик художников... Я могу сделать это


 

Я немного смущен к кэшированию, но кэширую каждый вызов к API в этом обработчике в течение 5 минут, но это имеет какое-либо значение, потому что каждый раз кто-то поражает новую привычку страницы художника, которую это все еще считает, поскольку новое ударилось о API?

Удивление, как лучше всего заняться этим

Спасибо

5
задан James A Mohler 30 November 2012 в 22:51
поделиться

2 ответа

Поскольку это простая модель данных, я бы не стал усложнять ситуацию с помощью специальных механизмов кэширования. Я бы поместил простую структуру / запрос: 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>

РЕДАКТИРОВАТЬ: да, вы должны поместить где-нибудь также метод, который удалял бы структурные ключи, где разница в отметках времени равна gt, а затем срок действия вашего кеша.

Рисунок фасада рекомендуется, чтобы его можно было изменить в будущем.

Извините за опечатки :)

3
ответ дан 15 December 2019 в 06:20
поделиться

Я бы попробовал использовать собственный кеш.

Это может быть структура, в которой ключи представляют собой имена исполнителей или другие уникальные идентификаторы ваших записей.

Если вы используете CF9 или Railo 3.1.2+, вы можете использовать встроенное кеширование (функции CachePut, CacheGet и т. Д.), Оно может обрабатывать таймауты и прочее.

В противном случае вы можете сохранить кэш в области приложения, но вам нужно будет включать метку времени с каждой записью и проверять ее при событиях кеширования (получение / размещение / удаление) или даже при каждом запросе.

0
ответ дан 15 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: