Spring кеш с использованием memcached

Я использую https://github.com/AKQABER/simple-spring-memcached чтобы memcached был интегрирован как реализация кеша с Spring.

Но у меня не было успеха: P

Я использую spring 4 и spring-data-jpa

public interface FooRepository extends JpaRepository<Foo, Long> {

@Cacheable(value = "defaultCache", key = "lala")
    Foo findByNameAndDescription(String name, String description);
} 

Я жестко запрограммировал ключ для тестовых целей. Ничего особенного, используйте кеш с названием «defaultCache». Конфигурация memcached следующая:

@Configuration
@EnableAspectJAutoProxy
public class CacheConfiguration
{

@Bean
public CacheManager cacheManager()
{
    MemcacheClientFactoryImpl cacheClientFactory = new MemcacheClientFactoryImpl();
    AddressProvider addressProvider = new DefaultAddressProvider("127.0.0.1:11211");
    com.google.code.ssm.providers.CacheConfiguration cacheConfiguration = new com.google.code.ssm.providers.CacheConfiguration();
    cacheConfiguration.setConsistentHashing(true); //TODO check this

    CacheFactory cacheFactory = new CacheFactory();
    cacheFactory.setCacheName           ( "defaultCache"        );
    cacheFactory.setCacheClientFactory  ( cacheClientFactory    );
    cacheFactory.setAddressProvider     ( addressProvider       );
    cacheFactory.setConfiguration       ( cacheConfiguration    );

    Cache object = null;
    try {
        object = cacheFactory.getObject();
    } catch (Exception e) {
        e.printStackTrace();
    }

    SSMCache ssmCache = new SSMCache(object, 10000, true); //TODO be very carefully here, third param allow remove all entries!!

    ArrayList<SSMCache> ssmCaches = new ArrayList<SSMCache>();
    ssmCaches.add(0, ssmCache);

    SSMCacheManager ssmCacheManager = new SSMCacheManager();
    ssmCacheManager.setCaches(ssmCaches);


    return ssmCacheManager;
}
}

И я могу протестировать это с помощью простого основного класса с кодом:

CacheManager cacheManager = context.getBean(CacheManager.class);
    FooRepository repository = context.getBean(FooRepository.class);

    Cache defaultCache = cacheManager.getCache("defaultCache");
    defaultCache.clear();
    Foo byNameAndDescription = repository.findByNameAndDescription(DEFAULT_NAME,    DEFAULT_DESCRIPTION);
    Object obj = defaultCache.get("lala");

И obj всегда равен нулю. Однако, если я использую объект defaultCache напрямую, я могу без проблем помещать и получать элементы в / из кеша. Любая идея?


person ilopezluna    schedule 17.11.2014    source источник
comment
Ключ принимает выражение, которое оценивается с помощью SpEL, если оно не может быть разрешено null будет использоваться в качестве ключа. Так что я предполагаю, что ключ, который вы ожидаете использовать, - нет.   -  person M. Deinum    schedule 17.11.2014
comment
Спасибо! Я уже пробовал «лала» вместо последнего ключа, и я все еще получаю значение null.   -  person ilopezluna    schedule 17.11.2014


Ответы (1)


Включили ли вы Spring Cache в своем приложении? В противном случае используйте @EnableCaching в компоненте конфигурации.

Если это не помогает, проверьте, работает ли кеширование, если вы используете org.springframework.cache.support.SimpleCacheManager вместо SSMCacheManager. В противном случае проблема с конфигурацией Spring Cache все еще существует.

person ragnor    schedule 17.11.2014
comment
Спасибо! Я забыл аннотацию @EnableCaching - person ilopezluna; 18.11.2014