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

spring - Spring Cache如何简化和优化?

燕光熙
2023-12-26

关于spring缓存的问题:

c1cfcce2dfe27824305d245b228613c.png

e0d7898d75f80be3e2ff5ccc5fa86de.png

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

共有2个答案

裴宏壮
2023-12-26

我的建议:

  • 先手动去实现这些逻辑,不要先引入Cache框架
  • 写的多了,你会发现一些问题。比如写起来很繁琐,跟业务代码耦合度很高
  • 然后你就会想抽象一下,使得更方便一些。自然是注解的方式
  • 再之后呢,看看Cache框架是怎么实现的,都能解决哪些问题,哪些问题是没办法处理的
华安民
2023-12-26

关于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 的使用并提高代码的简洁性和可读性。

 类似资料:
  • 本文向大家介绍请简述一下如何优化数据库?相关面试题,主要包含被问及请简述一下如何优化数据库?时的应答技巧和注意事项,需要的朋友参考一下 数据库的优化可以从四个方面来优化 1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离 2.从储存层: 采用合适的存储引擎,采用三范式 3.从设计层: 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysq

  • 如何清理linux不需要的软件包

  • 问题1[主]:是否可以优化? 我尝试过:避免使用非常大的数字的操作。所以我决定使用辅助数据。例如,我将转换为,其中。 问题:但是似乎比快十倍。这里是我的测试:

  • 我想知道如何优化我的画圆方法。在将顶点发送到opengl之前,我寻求如何尽快生成顶点。 FillRect函数只绘制一个四边形,因此DrawCircle函数绘制100个四边形,这些四边形按cos、sin和半径移动。 我怎么能以不同的方式画圆呢?

  • 有时候你会遇到循环,或者递归函数,它们会花费很长的执行时间,可能是你的产品的瓶颈。在你尝试使循环变得快一点之前,花几分钟考虑是否有可能把它整个移除掉,有没有一个不同的算法?你可以在计算时做一些其他的事情吗?如果你不能找到一个方法去绕开它,你可以优化这个循环了。这是很简单的,move stuff out。最后,这不仅需要智慧而且需要理解每一种语句和表达式的开销。这里是一些建议: 删除浮点运算操作。

  • 这样一堆 if 合理吗?后面还会加判断,会更多。 再拆分的话感觉不太好,有更好的方法吗?