0

私は2つのコントローラーメソッドを持っています。

@CacheEvict(value="showGearListCache")
def edit(Long id) {
}

@Cacheable(value="showGearListCache")
def show(Long id) {
}

キャッシュを適切に表示します。ID に対して 2 回実行されることはありません。ただし、「編集」を呼び出しても、その ID はキャッシュ解除されません。したがって、show - edit - show を呼び出すと、show は 2 回目は実行されません。

キーが違うのが問題かなと思ったので追加してみました

@Cacheable(value="showGearListCache", key="#id")
@CacheEvict(value="showGearListCache", key="#id")

両方の方法で、キャッシングが完全に機能しなくなったことに気付きました (削除は気にしないでください)。そこで、クラスに grailsCacheManager を注入してキャッシュの内容を調べたところ、使用されているキーが (例) であることがわかりました。

GET:/[CONTROLLER]/show/83

ちょうど「83」だったと思ったら。

もちろん、毎回すべてのエントリをクリアすることもできますが、1 つだけを無効にするのは本質的に無駄に思えます。

4

2 に答える 2

0

現在の grails キャッシュ プラグイン (v1.1.1) でコントローラー アクション キャッシュの特定のキーを削除できるかどうかはわかりません。で追い出すことができますallEntries=true

def show(Long id) {}キーが必要な場合は、メソッドの最初のパラメーターがどこにあるidかを指定できます。@Cacheable(value="showGearListCache", key="#p0")p0

また、コントローラー アクションの既定のキー ジェネレーター ( DefaultWebKeyGenerator ) は、要求の種類、URI、およびクエリ文字列の組み合わせを使用します。したがって、キーは のようになりますGET:/app/controller/show?id=83

于 2013-10-24T07:17:19.283 に答える
0

cacheキーは名前でスコープされるべきではありませんか?

@Cacheable(value="showGearListCache", key="#showGearListCache.id")
@CacheEvict(value="showGearListCache", key="#showGearListCache.id")

デフォルトでは、メソッドへのパラメーターはキーと見なされますが、それらへのアクセスはキャッシュ名指定子から行われます。

于 2013-07-16T02:36:10.960 に答える