CacheResolver和KeyGenerator之间的区别是什么,以及何时使用它们

时间:2018-01-22 20:29:40

标签: java spring caching ehcache

我正在为我的Web应用程序添加缓存机制。 在做了研究后,我决定在Spring中使用Ehcache

向方法添加@Cachable注释将执行该方法一次,对于任何进一步的调用,将从缓存中返回响应。

问题是我需要在运行时决定(假设根据登录用户)我想要使用哪个缓存。

我已经到了需要决定是使用KeyGenerators还是cacheResolver的地步。

我搜索了最佳实践,何时使用它们但没有找到任何好的读数。我希望如果有人能够澄清差异并详细阐述最佳实践并做到而不去做。

的KeyGenerator:

  @Bean
  public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
      @Override
      public Object generate(Object o, Method method, String loggedInUserId) {
        StringBuilder sb = new StringBuilder();
        sb.append("cache_");
        sb.append(loggedInUserId);
        return sb;
      }
    };

CacheResolver

class loggedInUserCacheResolver implements CacheResolver {
@Override
    public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
        Collection<Cache> caches = new ArrayList<>();
        // do some logic and return caches to use.
        return caches;
    }
}

1 个答案:

答案 0 :(得分:4)

RD只允许您操纵缓存键的创建。但是,所有键仍将属于单个缓存,即使它们不会发生任何冲突。

KeyGenerator允许您使用逻辑来选择要使用的CacheResolver

鉴于您的初始陈述,您的用例需要Cache。请注意,我没有仔细检查缓存是否已解析一次每次调用。

请注意,您可以将两个注释组合在一起,以获得自定义缓存和自定义键定义。