为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米琪卡哇伊 2021-05-07 14:22:54
我试图将缓存添加到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)}有什么方法可以在缓存的集合中创建/更新/删除值?还是将集合中的所有值作为单独的键缓存?
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


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


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


查看完整回答
反对 回复 2021-05-19
  • 3 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信