簡體   English   中英

使用Spring KeyGenerator生成唯一的緩存鍵不起作用

[英]Generating unique cache key with Spring KeyGenerator not working

當我的緩存鍵在Spring中使用@Cacheable注釋發生沖突時,我遇到了問題。 例如,使用以下兩種方法:

@Cacheable("doOneThing")
public void doOneThing(String name) {
  // do something with name
}

@Cacheable("doAnotherThing")
public void doAnotherThing(String name) {
  // do some other thing with name
}

這是我的緩存配置,其中我添加了一個keyGenerator和一個cacheManager bean:

@Configuration
@EnableCaching
public class CacheConfig {

  @Bean
  public JedisConnectionFactory redisConnectionFactory() {
    return new JedisConnectionFactory();
  }

  @Bean
  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
    RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
    redisTemplate.setConnectionFactory(cf);
    return redisTemplate;
  }

  @Bean
  public CacheManager cacheManager(RedisTemplate redisTemplate) {
    return new RedisCacheManager(redisTemplate);
  }

  @Bean
  public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
      @Override
      public Object generate(Object o, Method method, Object... params) {
        StringBuilder sb = new StringBuilder();
        sb.append(o.getClass().getName());
        sb.append(method.getName());
        for (Object param : params) {
          sb.append(param.toString());
        }
        return sb.toString();
      }
    };
  }
}

由於某種原因,緩存鍵始終設置為方法中的name參數,而不是keyGenerator.generate(..)方法的結果,導致兩個方法都返回相同的緩存結果。

我知道我可以在每個@Cacheable注釋上手動指定密鑰,但對於我想要緩存的每個方法來說,這似乎有點廣泛。

編輯

我注意到將@Cacheable注釋中的keyGenerator選項設置為my bean的名稱可以解決問題,如下所示:

@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
  // do something with name
}

在類上的@CacheConfig注釋中設置keyGenerator選項也可以解決問題。 看來這不應該是必要的。 我錯過了什么嗎?

您的配置應該實現CachingConfigurer (通常您將從CachingConfigurerSupport擴展)來自定義緩存的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM