Spring Cache如何简化和优化?

关于spring缓存的问题:

c1cfcce2dfe27824305d245b228613c.png

e0d7898d75f80be3e2ff5ccc5fa86de.png

  1. 类似我通过注解方式定义的缓存,我定义了设置缓存,获取缓存、删除缓存三个方法,但我感觉其中设置、删除缓存方法都很奇怪,设置缓存居然要提供返回值才能实际设置;删除缓存又是一个空的方法体。缓存是通过这种方式使用的吗?我感觉很奇怪
  2. 我在 application.yml 中配置了缓存的 cache-names;然后使用 @Cachable 注解IDE还是会提示要提供 name,有办法取消这种警告吗
  3. 上面获取缓存的值的方法我感觉有点复杂;先获取cache;在获取值的包装类,在获取值,而且每一步都要检查是否为null好麻烦,有更简便的做法吗

阅读 1.3k
avatarAI BotBETA

关于Spring Cache的简化和优化:

  1. 优化缓存的获取和设置方式
* 通常,Spring Cache 的 `get(key)` 方法用于获取缓存值,而 `put(key, value)` 方法用于设置缓存值。为了简化设置缓存的过程,你可以考虑使用 `putIfAbsent(key, value)` 方法,该方法仅在缓存中不存在指定键时才设置值。
* 对于删除缓存,`evict(key)` 方法用于删除指定键的缓存项。但如果你想删除所有缓存项,可以使用 `clear()` 方法。
  1. 消除 IDE 的警告
* 对于 IDE 的警告,可能是因为 `@Cachable` 注解需要指定 `name` 属性。你可以尝试使用 `@Cacheable` 注解(注意大小写),它是 `@Cachable` 的正确拼写,并且不需要指定 `name` 属性。
  1. 简化缓存值的获取过程
* 获取缓存值时,通常需要先获取 Cache 实例,然后调用 `get(key)` 方法。为了简化这一过程,你可以考虑使用 Spring Cache 的 `Cache.ValueWrapper` 接口,它提供了更简便的获取缓存值的方式。例如,`cache.get(key, Cache.ValueWrapper.class)` 可以直接返回缓存值,避免了中间的包装类转换。
* 在获取缓存值时,检查是否为 null 确实有些繁琐。一种简化的做法是使用 Optional 类来处理可能的 null 值。这样,你可以使用 `Optional.ofNullable(cache.get(key).get())` 来避免直接与 null 值的交互。

通过以上优化,你可以简化 Spring Cache 的使用并提高代码的简洁性和可读性。

2 个回答
  • 第一个问题,spring cache 实现如此,怪也得按格式写。
  • 第二个问题,可以给缓存类用 @CacheConfig(cacheNames = "test") 对此类统一设置来替代在application.yml配置文件中配置,以解决IDE的警告;但一般不推荐这么做,因为一个缓存类下要定义多个缓存的时候就不合适了,一般是要在缓存类的每个缓存方法(@Cacheable/@CachePut/@CacheEvict)中定义(还因为缓存一般要实现过期时间)。
  • 第三个问题,代码用法不对。取缓存的值仅调用 @Cacheable 注解的方法就行。有缓存值会返回值,无缓存值会执行方法体。当然在无缓存值的时候也会将返回值写入缓存,如果不希望写入缓存,可以用 @Cacheable(cacheNames = "test", key = "#id", unless = "#result == 0") 类似这种通过 unless 指明无缓存时不缓存的判断条件。

我的建议:

  • 先手动去实现这些逻辑,不要先引入Cache框架
  • 写的多了,你会发现一些问题。比如写起来很繁琐,跟业务代码耦合度很高
  • 然后你就会想抽象一下,使得更方便一些。自然是注解的方式
  • 再之后呢,看看Cache框架是怎么实现的,都能解决哪些问题,哪些问题是没办法处理的
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题