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

标签 java spring spring-boot caching 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)
}

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

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

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

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

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

最佳答案

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

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

我想解决这个问题的方法与“ map ”或分布式 map 有关,但我想使用 @Cacheable 注释。通过使用分布式 map ,无需使用 @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

关于java - Spring分别缓存列表中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51237672/

相关文章:

java - Spring boot,序列化和反序列化时 Jackson Json 问题

java - 为什么 Tomcat 7 将 index.html 附加到 URL 而 Tomcat 6 不附加?

java - 在 Spring Boot 中收到两个响应后如何并行调用 2 个外部 API 并执行合并

java - 是否可以从Spring应用程序上下文中获取basePackages值?

mysql - 当数据库发生变化时如何调用java操作

java - SpringBoot 和 DynamoDb-Local Embedded

java - 如何使用按钮将表单数据作为句子中的变量发送到剪贴板?

java - 链表堆栈丢失最后一个压入堆栈的项目

java - 静态 index.html 文件 - servlet 容器是否首先被命中?

java - 无法将Spring云配置服务器连接到本地存储库窗口