Spring分别缓存列表中的所有元素
我试图将缓存添加到CRUD应用程序,我开始执行以下操作:
@Cacheable("users")List<User> list() {
return userRepository.findAll()
}
@CachePut(value = "users", key = "#user.id")
void create(User user) {
userRepository.create(user)
}
@CachePut(value = "users", key = "#user.id")
void update(User user) {
userRepository.update(user)
}
@CacheEvict(value = "users", key = "#user.id")
void delete(User user) {
userRepository.delete(user)
}
我的问题是我希望create / update /
delete操作可以为该操作更新已存储在缓存中的元素list()
(请注意,list()
不是从数据库中拉出而是从数据引擎中拉出),但是我无法做到这一点。
我想缓存list()
单独返回的所有元素,以便所有其他操作可以使用来更新缓存#user.id
。或者,可能需要执行所有操作来更新已存储在缓存中的列表。
我读到我可以在更新整个缓存时逐出整个缓存,但是我想避免这样的事情:
@CacheEvict(value = "users", allEntries=true) void create(User user) {
userRepository.create(user)
}
有什么方法可以在缓存的集合中创建/更新/删除值?还是将集合中的所有值作为单独的键缓存?
回答:
由于没有人提供任何帮助,我会自我回答。
我在处理此问题时遇到的问题是对缓存使用情况的误解。我对此问题发表的需求与 如何更新缓存列表的成员有关(方法响应)
。缓存无法解决此问题,因为缓存的值是列表本身,因此我们无法部分更新缓存的值。
我想解决此问题的方式与“地图”或分布式地图有关,但我想使用@Cacheable
注释。通过使用分布式地图,无需使用即可达到我在问题中的要求@Cacheable
。因此,返回的列表可能已经更新。
因此,我不得不(希望)@Cacheable
从另一个角度来解决这个问题。每当需要更新的缓存时,我都会使用此代码对其进行刷新。
我使用下面的代码来解决我的问题:
@Cacheable("users")List<User> list() {
return userRepository.findAll()
}
// Refresh cache any time the cache is modified
@CacheEvict(value = "users", allEntries = true")
void create(User user) {
userRepository.create(user)
}
@CacheEvict(value = "users", allEntries = true")
void update(User user) {
userRepository.update(user)
}
@CacheEvict(value = "users", allEntries = true")
void delete(User user) {
userRepository.delete(user)
}
另外,我为spring缓存启用了日志记录输出,以确保/了解缓存的工作方式:
# Log Spring Cache outputlogging.level.org.springframework.cache=TRACE
以上是 Spring分别缓存列表中的所有元素 的全部内容, 来源链接: utcz.com/qa/427280.html