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

问题描述 投票:8回答:1

我正在尝试将缓存添加到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)
}

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

java spring spring-boot caching spring-cache
1个回答
0
投票

我会自行回答我的问题,因为没有人愿意提供任何帮助。

我想解决此问题的方式与“地图”或分布式地图相关,但我想使用@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)
}

-1
投票

[peepeepeepeepeepeepeepeepeepeepeepeepeepeepeepeepeepeepeepeepeepeepee] >>

© www.soinside.com 2019 - 2024. All rights reserved.