@Cacheable并不尊重grails中的key =?

时间:2013-07-14 20:48:34

标签: caching grails

我有两种控制器方法,

@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”时。

当然,我每次都可以清除所有条目,但如果我只是使一个条目失效,这似乎本身就是浪费。

2 个答案:

答案 0 :(得分:0)

密钥不应该由cache名称确定范围吗?

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

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

答案 1 :(得分: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