【发布时间】:2015-04-19 04:42:37
【问题描述】:
我有一个关于使用 spring 和 ehCache 的最佳实践的问题。
例如,如果我有两个使用 @Cacheable 注释的方法使用相同的参数值,那么 ehcache 将返回最新的缓存值。
@Cacheable(value="imagesCache",key="#id_image")
public Image getUserImage(id_image){ //stuff }
//and
@Cacheable(value="imagesCache",key="#id_image")
public Image getProductImage(id_image){ //stuff }
如果我先调用 getUserImage(10),然后调用 getProductImage(10),ehcache 将为这两种方法返回相同的值,因为它们具有相同的键。 我认为 ehcache,使用 key 和方法名称 索引缓存值,因此如果两个方法具有相同的 #key(在我的示例中为 10),它将查看方法名称。
我知道最简单的解决方案是创建两个缓存(“userImagesCache”和“productImagesCache”),但在这种情况下我想避免这种情况。
如何解决?
谢谢。
【问题讨论】:
-
为什么不想要两个单独的缓存?用户和产品看起来像是不同的集合。
-
因为最后我会得到几十个缓存。用户可以拥有图像、地址、电话,其中一些可能具有相同的密钥...
-
在这一切之下,Spring其实是在使用AOP来拦截方法调用,创建缓存key,缓存方法响应。您可以自己使用 spring 配置而不是注释来完成所有这些。然后你可以实现你自己的“拦截器”,它会创建你自己设计的密钥。虽然@retoq 似乎在这里提供了正确的答案。