我有两种控制器方法,
@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”时。
当然,我每次都可以清除所有条目,但如果我只是使一个条目失效,这似乎本身就是浪费。
答案 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
。