2015-04-16 3 views
0

Я использую Spring Redis с аннотацией @Cacheable для двух методов. Когда я вызываю один метод, я получаю результат, кэшированный для другого метода.spring redis неправильный результат

Как может случиться так, что я получаю результат из-за неправильного кеша, когда я настроил другой кеш для каждого метода, используя аннотацию @Cachebale?

Установка: Весенняя версия 4.1.6. Redis data 1.5 и клиент Redis 2.7.0.

Пример кода:

@Cacheable("test1") 
    public List<String> findSgsns() { 
} 

@Cacheable("test2") 
    public List<String> findSgsns2() { 
} 
+0

Пожалуйста, уточните вашу проблему. – dunni

ответ

0

Проблема была sloved, добавив следующий параметр к весне конфигурацию (набор usePrefix):

<bean 
    id="cacheManager" 
    class="org.springframework.data.redis.cache.RedisCacheManager" 
    c:template-ref="redisTemplate"> 
    <property name="usePrefix" value="true" /> 
</bean> 
0

По умолчанию, весна использовать SimpleKeyGenerator для генерации если вы не укажете его в аннотации @Cacheable.

public class SimpleKeyGenerator implements KeyGenerator { 

@Override 
public Object generate(Object target, Method method, Object... params) 
{ 
    return generateKey(params); 
} 

/** 
* Generate a key based on the specified parameters. 
*/ 
public static Object generateKey(Object... params) { 
    if (params.length == 0) { 
     return SimpleKey.EMPTY; 
    } 
    if (params.length == 1) { 
     Object param = params[0]; 
     if (param != null && !param.getClass().isArray()) { 
      return param; 
     } 
    } 
    return new SimpleKey(params); 
} 
} 

Как нет метода аргументы в обоих ваших методов (findSgsns() and findSgsns2()), она по существу будет генерировать один и тот же ключ кэша для обоих методов.

Вы уже нашли решение, которое в основном утилизировать usePrefix свойство в redisTemplate боба, который по существу добавить вам значение (а именно, «test1» и «test2») вы указали в @Cacheable аннотацию, когда он формирует ключ кэша в Redis. Я хотел бы упомянуть еще 2 альтернативы для полноты картины здесь:

  1. Укажите свой собственный ключ для каждого метода (Примечание: вы можете использовать Spring EL указать свои ключи):

    @Cacheable(value = "test1", key = "key1") 
    public List<String> findSgsns() { 
    } 
    
    @Cacheable(value = "test2", key = "key2") 
    public List<String> findSgsns2() { 
    } 
    
  2. Создание пользовательского генератора ключей, и ниже приведены пример ключевого генератор, который принимает имя методы в Redis кэшировать генерации ключа (Примечание: генератор пользовательского ключа вступит в силу автоматически, расширяя CachingConfigurerSupport класса):

    @Configuration 
    public class RedisConfig extends CachingConfigurerSupport { 
    
    @Bean 
    public KeyGenerator keyGenerator() { 
        return new KeyGenerator() { 
         @Override 
         public Object generate(Object target, Method method, Object... params) { 
          StringBuilder sb = new StringBuilder(); 
          sb.append(target.getClass().getName()); 
          sb.append(method.getName()); 
          for (Object obj : params) { 
           sb.append(obj.toString()); 
          } 
          return sb.toString(); 
         } 
        }; 
    } 
    
    } 
    
Смежные вопросы