Spring缓存 - 自动更新缓存的setter

时间:2014-01-01 16:57:21

标签: spring caching ehcache

我真的很喜欢弹簧缓存。

我看到Spring缓存注释主要基于注释方法。

我的问题是我是否有一个具有以下方法的dao类:

 public User getUserById(long id);

让我说我缓存这种方法。

并有另一个dao方法(没有注释),如:

 public void updateUser(User u);

现在想象一下这个场景:

1)有人调用getUserById(user1Id); //(大小为1的缓存现在有user1)

2)其他人调用updateUser(User1); //让我们说一个简单的名称更改

3)其他人调用getUserById(user1Id);

我的问题:

假设没有采取其他行动,第3次调用是否会收到弃用的数据? (用旧名称)?

如果是这样,如何解决这个简单的用例?

2 个答案:

答案 0 :(得分:2)

是的,第三次调用将返回陈旧数据。

要解决此问题,您应该在更新操作后触发缓存逐出,方法是使用@CacheEvict注释注释您的更新方法:

@CacheEvict(value = "users", key = "#user.id")
void updateUser(User user) {
    ...
}

其中value = "users"与您用于getUserById()方法的缓存名称相同,User类具有Long类型的id属性(用作用户)缓存密钥)

答案 1 :(得分:1)

您需要从缓存中删除过时的项目。 Spring框架有助于处理几个与缓存相关的注释(例如,您可以使用@CacheEvict注释update-method)。顺便说一句,Spring在缓存方面有很好的documentation