10

ユーザーのセッション中 (インターフェイスの使用中) に、外部 Web サービスを定期的に数回呼び出す必要がある単純な Grails アプリケーションがあります。

この Web サービスの応答をキャッシュしたいのですが、サービスからの結果は数日ごとに変化するため、短時間 (おそらく毎日の更新) だけキャッシュしたいと考えています。

Grails キャッシュ プラグインは "time to live" 実装をサポートしていないようです。この問題を最もよく解決するプラグインまたはプログラム ソリューションを知りたいです。

例:

BuildConfig.groovy

plugins{
    compile ':cache:1.0.0'
}

MyController.groovy

def getItems(){
    def items = MyService.getItems()
    [items: items]
}

MyService.groovy

@Cacheable("itemsCache")
class MyService {
    def getItems() {
        def results

        //expensive external web service call

        return results
    }
}

アップデート

多くの良い選択肢がありました。Burt が提案したプラグイン アプローチを採用することにしました。他の人が同様のことをしたいのを助けるために、上記のコード例に小さな変更を加えたサンプルの回答を含めました。この構成では、24 時間後にキャッシュが期限切れになります。

BuildConfig.groovy

plugins{
    compile ':cache:1.1.7'
    compile ':cache-ehcache:1.0.1'
}

Config.groovy

grails.cache.config = {
    defaultCache {
        maxElementsInMemory 10000
        eternal false
        timeToIdleSeconds 86400
        timeToLiveSeconds 86400
        overflowToDisk false
        maxElementsOnDisk 0
        diskPersistent false
        diskExpiryThreadIntervalSeconds 120
        memoryStoreEvictionPolicy 'LRU'
     }
 }
4

4 に答える 4

12

コア プラグインは TTL をサポートしていませんが、Ehcache プラグインはサポートしています。http://grails-plugins.github.com/grails-cache-ehcache/docs/manual/guide/usage.html#dslを参照してください。

http://grails.org/plugin/cache-ehcacheプラグインはhttp://grails.org/plugin/cacheに依存しますが、キャッシュ マネージャーを Ehcache を使用するものに置き換えます (両方をインストールする必要があります)。

于 2013-02-13T03:09:04.417 に答える
1

ハック/回避策は、@Cacheable("itemsCache") と @CacheFlush("itemsCache") の組み合わせを使用することです。

結果をキャッシュするように getItems() メソッドに指示します。

@Cacheable("itemsCache")
def getItems() {
}

次に、ジョブから頻繁に呼び出すことができる、キャッシュをフラッシュする別のサービス メソッドです。

@CacheFlush("itemsCache")
def flushItemsCache() {}
于 2013-02-13T05:57:42.057 に答える
0

grails-cache単体テスト (timeToLiveSeconds を探す) から、メソッド呼び出しごとなどではなく、キャッシュ レベルでキャッシュを構成できることがわかります。この方法を使用して、grails.cache.configの設定を構成します。

Time-to-Live 設定で専用キャッシュを作成し、それをサービスで参照します。

于 2013-02-12T20:35:11.503 に答える