当前位置: 首页 > 知识库问答 >
问题:

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

赫连冠玉
2023-03-14
@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)
}

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

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

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

共有1个答案

谭仰岳
2023-03-14

我会自己回答我的问题,因为没有人给予任何帮助,也没有人能帮助别人。

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

我想解决这个问题的方法与“map”或分布式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)
}
# Log Spring Cache output
logging.level.org.springframework.cache=TRACE
 类似资料:
  • 问题内容: 是否有一种(非破坏性的)方式列出缓冲通道中的所有元素? 我唯一能想到的就是循环所有这些,最后将它们重新插入。这似乎不是最聪明的方法。 链接到游乐场 问题答案: 从2011年开始,该线程在通道周围提供了一些包装程序,以启用Peek()函数,但这比其他任何方法都更可行。 总的结论是: 同步通道没有头(就像零长度切片) 你不能那样做,因为 a)它被放回队列的尾部而不是末端,并且 b)作家可能

  • 问题内容: 有人告诉我 编写一个函数square(a),该函数接受一个数字数组a并返回一个包含每个平方值的数组。 起初,我有 但是,由于我正在打印,而且没有像被问到的那样返回,因此这不起作用。所以我尝试了 但这仅平方我数组的最后一个数字。我如何才能使整个列表平方? 问题答案: 您可以使用列表理解: 或者您可以: 或者,您可以使用发电机。它不会返回列表,但是您仍然可以迭代它,并且由于不必分配整个新列

  • 问题内容: 我已经使用了C#Redis缓存。 但我想像这样存储数据 这样一键就可以存储所有客户列表,并且可以轻松地在该列表内搜索,分组,过滤客户数据 欢迎使用或回答 问题答案: 您可以使用ServiceStack.Redis高级IRedisTypedClient Typed API 来管理丰富的POCO类型。 首先为具有以下条件的客户获取类型化的Redis客户端: 这将解决用于管理客户POCO的高

  • 问题内容: 我有一个对象列表,其中每个对象返回。我如何使用Java 8流仅获得一个? 类具有以下方法; 我有 我正在尝试的是 但是上面的行没有返回 ,而是 我不想要的。 问题答案: 您应该用来从包含在主列表中每个对象中的列表中创建一个列表。请检查; 该调用适用于列表中包含with 的情况,因为这将导致下一行,因此我们应该将其过滤掉。还有其他方法可以实现这一点; -- -- 您可以按如下方式包含来自

  • 我是冬眠新手,不会RTFM,所以我希望有人能帮我节省很多时间。 我的数据库中的对象之间有多对多的关系。假设员工和工作。 我想选择分配给给定员工的所有作业。我的对象乔布斯有一个正在处理它的所有员工的列表。所以,在java中,它应该是:作业job.employees.contains(员工)。除了我需要把它变成一个Hibernate查询什么的。 现在,我在选择所有东西后,正在Java中使用蛮力。 如何

  • 我在使用for循环将元素分配到List时遇到了麻烦。以下是我遇到麻烦的代码部分: 出于某种原因,该方法返回一个所有元素完全相同的列表。我试着输出列表元素,看看这是在哪里发生的,它似乎是在循环之外发生的。例如: 显示不同元素的列表,而这: 显示仅由相同元素组成的列表。在我看来,这些元素被正确地添加到for循环内部的列表中,但最终却变得完全相同。这是为什么?我该怎么解决?