首页 > 解决方案 > 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)
}

我遇到的问题是我希望创建/更新/删除操作可以更新已存储在缓存中的元素以进行list()操作(注意list()不是从数据库中提取,而是从数据引擎中提取),但我无法做到.

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

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

@CacheEvict(value = "users", allEntries=true) 
void create(User user) {
    userRepository.create(user)
}

有没有办法在缓存集合中创建/更新/删除值?或者将集合中的所有值缓存为单个键?

标签: javaspringspring-bootcachingspring-cache

解决方案


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

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

我想解决这个问题的方式与“地图”或分布式地图有关,但我想使用@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 output
logging.level.org.springframework.cache=TRACE

推荐阅读