0

我有两种控制器方法,

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

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

正确显示缓存:它不会为任何 id 执行两次。但是,调用“编辑”不会取消缓存该 ID。所以如果我调用show - edit - show,show 将不会执行第二次。

我认为问题可能是键不同,所以我尝试添加

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

两种方法,并注意到缓存完全停止工作(没关系驱逐)。因此,我通过将 grailsCacheManager 注入类来检查缓存中的内容,并发现它使用的键是(一个示例):

GET:/[CONTROLLER]/show/83

当我预计它只是“83”时。

当然,我每次都可以清除所有条目,但是如果我只是使一个无效,那似乎本质上是浪费。

4

2 回答 2

0

键不应该由cache名称限定吗?

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

默认情况下,方法的参数被视为键,但访问它们将来自缓存名称说明符。

于 2013-07-16T02:36:10.960 回答
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 回答