Spring分别缓存列表中的所有元素

Fed*_*zza 7 java spring caching spring-boot spring-cache

我试图将缓存添加到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)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我希望create / update / delete操作可以为该操作更新已存储在缓存中的元素list()(请注意,list()不是从数据库中拉出而是从数据引擎中拉出),但是我无法做到这一点。

我想缓存list()单独返回的所有元素,以便所有其他操作可以使用来更新缓存#user.id。或者,可能需要执行所有操作来更新已存储在缓存中的列表。

我读到我可以在更新整个缓存时逐出整个缓存,但是我想避免这样的事情:

@CacheEvict(value = "users", allEntries=true) 
void create(User user) {
    userRepository.create(user)
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在缓存的集合中创建/更新/删除值?还是将集合中的所有值作为单独的键缓存?

Fed*_*zza 11

我会自己回答我的问题,因为没有人给出任何并可以帮助他人。

我在处理这个问题时遇到的问题是对缓存使用的误解问题。我在这个问题上发布的需求与如何更新缓存列表的成员有关(方法响应)。这个问题不能用缓存解决,因为缓存的值是列表本身,我们不能部分更新缓存的值。

我想解决这个问题的方式与“地图”或分布式地图有关,但我想使用@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)
}
Run Code Online (Sandbox Code Playgroud)

此外,我已启用 spring 缓存的日志输出以确保/了解缓存的工作方式:

# Log Spring Cache output
logging.level.org.springframework.cache=TRACE
Run Code Online (Sandbox Code Playgroud)


Joh*_*lum 8

再一次,这不是第一次问这个问题。

  1. 如何使用弹簧缓存基于主键缓存整个列表
  2. 带有项目/实体集合的Spring Cache
  3. 使用注释将所有返回的元素放入Spring-Boot缓存
  4. 在采用带有数组或集合参数的方法上使用Spring Cache存在哪些策略?

再一次,答案是相同的。

我怀疑其中任何一个链接都会有所帮助,但也许从#3开始。

干杯,约翰

  • 对不起,约翰,但是您所有的答案都只是大量的文本,链接和更多文本。这就是为什么“这不是第一次问这个问题”。 (5认同)
  • @dit-给一个人一条鱼,喂它们一天,教他们钓鱼,然后……嗯,也许吧。对于那些在SO上提出问题的人,一开始就不寻求答案也是很常见的!此外,某些答案比其他答案更有意义,尤其是如果您想正确地理解要解决的问题,而不是简单地复制并粘贴解决方案。而且,如果您一开始就读过我的答案,您就会知道我花了很多时间来提供良好的答案,并且您还会注意到,我也提供了指向支持我的答案的“代码示例”的链接。无论如何。 (2认同)