2014-11-17 9 views
1

Мое приложение имеет пару служб, которые делают внешние вызовы через httpClient (GET и POST), которые вряд ли будут меняться в течение нескольких месяцев, но они медленны; делая мое приложение еще медленнее. Уточнение: это НЕ о кешировании GORM/hibernate/queries для моего db.Как настроить кеширование метода службы в grails

Как кешировать эти методы (сохранение на диске получает бонусные баллы ...) в grails 2.1.0?

Я установил плагин grails-cache-plugin, но он, похоже, не работает, или я настроил его неправильно (очень сложно сделать, поскольку есть только 2-5 строк для добавления, но мне удалось это сделать это в прошлом)

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

Любые предложения/идеи будут очень признательны.

EDIT: Текущее решение (на основе ответа Marcin в)

Мой Config.groovy: (кэширование часть только)

//caching 
grails.cache.enabled = true 
grails.cache.clearAtStartup = false 

grails.cache.config = { 
    defaults { 
     timeToIdleSeconds 3600 
     timeToLiveSeconds 2629740 
     maxElementsInMemory 1 
     eternal false 
     overflowToDisk true 
     memoryStoreEvictionPolicy 'LRU' 
    } 

    diskStore { 
     path 'cache' 
    } 

    cache { 
     name 'scoring' 
    } 
    cache { 
     name 'query' 
    } 
} 

Важные детали:

  • сделать непонятно при запуске (grails.cache.clearAtStartup = false)
  • overflowToDisk = true persists все результаты по maxElementsInMemory
  • maxElementsInMemory = 1 уменьшенное количество элементов в памяти
  • «diskStore» должен быть доступен для записи пользователем, запускающим приложение.
+0

Плагин кеша должен быть способ перехода. Что вы делали, это не сработало? – doelleri

ответ

4

Grails Cache Plugin Работает хорошо для меня под Grails 2.3.11. Documentation довольно аккуратный, но только, чтобы показать вам проект ...

Я использую следующие настройки в Config.groovy:

grails.cache.enabled = true 
grails.cache.clearAtStartup = true 

grails.cache.config = { 
    defaults { 
     maxElementsInMemory 10000 
     overflowToDisk false 
     maxElementsOnDisk 0 
     eternal true 
     timeToLiveSeconds 0 
    } 
    cache { 
     name 'somecache' 
    } 
} 

Тогда в службе я использую что-то вроде:

@Cacheable(value = 'somecache', key = '#p0.id.toString().concat(#p1)') 
def serviceMethod(Domain d, String s) { 
    // ... 
} 

Обратите внимание, что часть somecache используется повторно. Кроме того, было важно использовать String в качестве ключа в моем случае.Вот почему я использовал toString() на id.

Плагин также может быть настроен на использование дискового хранилища, но я его не использую.

Если это не поможет, предоставьте более подробную информацию о своей проблеме.

+0

Спасибо за ответ, вот как я начал, но мне все еще нужно сохранять данные кэша. Также у вас есть собственный класс для генерации ключей или по умолчанию? – CoderX

+0

По умолчанию было достаточно. Учитывая сохраняющийся ... Я использую [Ehcache Cache Plugin] (http://grails.org/plugin/cache-ehcache) вместе с Cache, и это на самом деле ** обеспечивает ** постоянство. Например, описаны настройки 'overflowToDisk' и' maxElementsOnDisk' [здесь] (http://grails-plugins.github.io/grails-cache-ehcache/guide/usage.html). Я совершенно уверен, что это путь. Пожалуйста, дайте мне знать, если я могу вам помочь. Tx! –

+0

Спасибо Marcin, это поставило меня в правильном направлении. Я отредактировал свой вопрос с текущим решением с поддержкой, но мне, возможно, придется уточнить его позже. – CoderX

0

Это может не помочь, но если вы обновите приложение до Grails 2.4.x, вы можете использовать аннотацию @Memoize. Это будет автоматически кэшировать результаты каждого вызова метода на основе переданных в него аргументов.

+0

В конце концов, моя идея - сделать переход на 2.4, но, увидев, что мой босс сражается с другим обновлением (2.1 -> 2.4), я решил оставить его, когда у меня много времени. Спасибо за эту идею. – CoderX

0

Чтобы сохранить эту «почти статическую» информацию, вы можете использовать Memcached или Redis в качестве системы кеша. (Есть много других)

Эти две системы кэширования позволяют хранить данные о значении ключа (в вашем случае что-то вроде этого «key_GET»: JSON, XML, MAP, String).

Вот родственный сообщение: Memcached vs. Redis?

С уважением.