1

我将@CacheableSpring 3.1一起使用。我对 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时,第二种方法返回第一种方法的结果。实际上,我有很多服务,因此我希望为特定用例使用可缓存的通用值。现在我的问题是:

  • 我该如何解决这个问题?
  • 为每个服务使用可缓存是个好主意吗?
  • 指定时间后将缓存完全从内存中删除而不使用 @CacheEvict ?
4

2 回答 2

2
  • 我该如何解决这个问题?

我假设zoneMastNo并且areaMastNo是完全不同的键,我的意思是List<Option>for zoneMastNo=1List<Option>for areaMastNo=不同1。这意味着您需要两个缓存- 一个按区域键控,另一个按区域键控。但是,您只明确使用了一个名为message. 引用29.3.1 @Cacheable 注释

@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)

您还确定这些方法不会根据local参数产生不同的结果吗?如果不是,它是用来做什么的?


为每个服务使用可缓存是个好主意吗?

不,原因如下:

  • 有些方法足够快
  • ...并且缓存本身引入了一些开销
  • 某些服务调用其他服务,您是否需要在每个层次结构级别上进行缓存
  • 缓存需要内存,很多
  • 缓存失效很难

指定时间后将缓存完全从内存中删除而不使用 @CacheEvict ?

这完全取决于您的缓存实现。但是每个理智的实现都有这样的选择,例如 EhCache。

于 2013-01-11T18:58:58.070 回答
0

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

于 2013-01-11T06:57:02.500 回答