我真的很喜欢弹簧缓存。
我看到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次调用是否会收到弃用的数据? (用旧名称)?
如果是这样,如何解决这个简单的用例?
答案 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。