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

@可缓存Spring3.1

汪兴为
2023-03-14

我在Spring3.1中使用@Cacheable。我对Cacheable中的值和键映射参数有点混淆。以下是我正在做的:

@Cacheable(value = "message", key = "#zoneMastNo")
public List<Option> getAreaNameOptionList(String local, Long zoneMastNo) {
//..code to fetch data form database..
return list;
}

@Cacheable(value = "message", key = "#areaMastNo")
public List<Option> getLocalityNameOptionList(String local, Long areaMastNo) {
//..code to fetch data form database..
return list;
}

这里发生的情况是,第二个方法依赖于第一个方法的选定值,但问题是假设当我传递zoneMastNo=1和areaMastNo=1时,第二个方法返回第一个方法结果。事实上,我有很多服务,因此,我希望使用公共值来缓存特定的用例。现在我的问题是:

  • 我如何解决这个问题
  • 对每个服务都使用cacheable是一个好主意吗
  • 在指定的时间之后,缓存是否会在不使用@cacheexecute的情况下从内存中完全删除

共有2个答案

耿运浩
2023-03-14

问题3:这取决于你的缓存过期配置。如果你使用ehache,改变ehcache.xml.中的设置

陶健
2023-03-14
  • 我如何解决这个问题

我假设zoneMastNoareaMastNo是完全不同的键,我的意思是List

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

在上面的代码片段中,findBook方法与名为books的缓存相关联。

所以如果我理解正确,你应该基本上使用两种不同的缓存:

@Cacheable(value = "byZone", key = "#zoneMastNo")
public List<Option> getAreaNameOptionList(String local, Long zoneMastNo)
//...
@Cacheable(value = "byArea", key = "#areaMastNo")
public List<Option> getLocalityNameOptionList(String local, Long areaMastNo)

此外,您确定这些方法不会根据本地参数有不同的结果吗?如果没有,那是用来干什么的?

对每个服务都使用cacheable是一个好主意吗?

没有,原因如下:

  • 有些方法足够快
  • 。。。缓存本身也带来了一些开销
  • 有些服务调用其他服务,您是否需要在每个层次结构级别上进行缓存
  • 缓存需要大量内存
  • 缓存失效是很困难的

在指定的时间之后,缓存是否会在不使用@cacheexecute的情况下从内存中完全删除?

这完全取决于您的缓存实现。但是每一个正常的实现都有这样一个选项,例如:EhCache.

 类似资料:
  • 我正在使用注释来缓存我的方法的结果。出于性能原因,我想缓存从方法返回的和非null值。 但是这里的问题是Spring缓存非空值,但由于某种原因没有缓存空值。 这是我的密码: 我什么都试过了。就连我 但这也没什么帮助。有关于这个的指示吗?

  • 我有一个Spring应用程序,它使用MyBatis进行持久化。我使用ehcache是因为速度对于这个应用程序很重要。我已经设置并配置了MyBatis和Ehcache。我使用一个名为“mybatis”的单一缓存,因为否则为每个实体创建单独的缓存将是荒谬的。 这是我的电子缓存。xml。 这是我的mybatis映射器界面的一个示例。 因为我有一个共享缓存,所以我需要一种方法使我的密钥对域对象是唯一的。作

  • 问题内容: 我的任务是利用SpringCache作为我们的一项服务,以减少数据库查找的次数。在测试实现时,我注意到一些可缓存操作通过日志语句多次调用。调查显示,如果在可缓存的方法中调用了可缓存的操作,则嵌套操作根本不会被缓存。因此,嵌套操作的后续调用将导致进一步的查找。 下面列出了描述问题的简单单元测试: 这两种方法的实际工作对于测试用例本身并不重要,因为仅应测试缓存。 我以某种方式理解了为什么不

  • 我正在尝试在Android环境中学习rxjava。比方说,我有一个可观察的对象,它发出网络调用的结果。如果我理解正确的话,处理配置更改的一种常见方法是: > 将可观察对象存储在保留的片段/单例/应用程序对象中 将缓存操作符应用于可观察对象 在正确的生命周期处理程序中订阅/取消订阅 这样做,我们就不会失去可观察到的结果,一旦新配置发生,将重新观察到该结果。 现在,我的问题是: 有没有办法强制可观察对

  • 我试图以某种方式“调试”使用spring boot cache注释的应用程序,为此,我想知道如何找到实际实现接口Cacheable、CacheConfig等的类。 我的想法是确认缓存正在被填充、清空等。

  • 我想将主数据缓存到Redis。 所以,我写了这些代码。 和 和ymlfile 但是,缓存不工作... 无论何时调用printTest方法,都将执行“getTest”方法。Redis没有数据。。。我的代码中有什么问题? SpringBoot版本是1.4.0 依赖关系是