Невозможно получить хороший пример использования memcached из загрузки Java

Я использую Java-загрузку для моей разработки. Сейчас я использовал EhCache для кеширования, он поддерживается напрямую из загрузки Java. Это "внутрипроцессный" кэш, т.е. становится частью вашего процесса. Пока все хорошо. Но мой сервер будет работать на нескольких узлах в ближайшем будущем. Следовательно, вы хотите переключиться на Memcached в качестве общего уровня кэширования.

Потратив достаточно времени, я не смог получить хороший пример использования Memcached из java boot. Я посмотрел на " Simple Spring Memcached", который приближается к моему требованию. Но все же это дает пример использования конфигурации XML в Spring. Загрузка Java не использует такую ​​конфигурацию XML, насколько это возможно. По крайней мере, я не смог быстро сопоставить пример с java boot world.

Я хочу использовать Memcahed (напрямую или через уровень кеш-абстракции) из загрузки Java. Если кто-нибудь укажет мне на соответствующий пример загрузки java, это сэкономит мне много времени.

3 ответа

Решение

Вы можете найти некоторые материалы по настройке SSM с использованием конфигурации Java вместо файлов XML здесь и здесь. По сути, вы должны переместить определения всех bean-компонентов из XML в Java.

Вы также можете проверить библиотеку Memcached Spring Boot. Он использует реализацию Memcached для Spring Cache Abstraction.

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

Есть также примеры проектов на Kotlin и Java.

Я уже принял ответ от @ragnor. Но я думаю, что я должен опубликовать полный пример здесь, который работал для меня.

  1. Убедитесь, что у вас включен кеш для вашего приложения, добавив @EnableCaching
  2. POM.xml должен иметь следующую зависимость:
<dependency>
        <groupId>com.google.code.simple-spring-memcached</groupId>
        <artifactId>spring-cache</artifactId>
        <version>3.6.1</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.simple-spring-memcached</groupId>
        <artifactId>spymemcached-provider</artifactId>
        <version>3.6.1</version>
    </dependency>
  1. Добавьте файл конфигурации для настройки конфигурации кэша memcached, скажем, MySSMConfig.java
@Configuration
@EnableAspectJAutoProxy
@ImportResource("simplesm-context.xml") // This line may or may not be needed,
                                        // not sure
public class SSMConfig 
{
    private String _memcachedHost; //Machine where memcached is running
    private int _memcachedPort;    //Port on which memcached is running

     @Bean
     public CacheManager cacheManager() 
     {
         //Extended manager used as it will give custom-expiry value facility in future if needed
         ExtendedSSMCacheManager ssmCacheManager = new ExtendedSSMCacheManager();

         //We can create more than one cache, hence list
         List<SSMCache>cacheList = new ArrayList<SSMCache>();

         //First cache: Testcache
         SSMCache testCache = createNewCache(_memcachedHost, _memcachedPort, 
                                    "testcache", 5);

         //One more dummy cache
         SSMCache dummyCache = createNewCache(_memcachedHost,_memcachedPort, 
                    "dummycache", 300);

         cacheList.add(testCache);
         cacheList.add(dummyCache);

         //Adding cache list to cache manager
         ssmCacheManager.setCaches(cacheList);

         return ssmCacheManager;
     }


    //expiryTimeInSeconds: time(in seconds) after which a given element will expire
    //
    private SSMCache createNewCache(String memcachedServer, int port, 
                                String cacheName, int expiryTimeInSeconds)
    {
        //Basic client factory to be used. This is SpyMemcached for now.
        MemcacheClientFactoryImpl cacheClientFactory = new MemcacheClientFactoryImpl();

        //Memcached server address parameters
        //"127.0.0.1:11211"
        String serverAddressStr = memcachedServer + ":" + String.valueOf(port);
        AddressProvider addressProvider = new DefaultAddressProvider(serverAddressStr);

        //Basic configuration object
        CacheConfiguration cacheConfigToUse = getNewCacheConfiguration();

        //Create cache factory
        CacheFactory cacheFactory = new CacheFactory();
        cacheFactory.setCacheName(cacheName);
        cacheFactory.setCacheClientFactory(cacheClientFactory);
        cacheFactory.setAddressProvider(addressProvider);
        cacheFactory.setConfiguration(cacheConfigToUse);

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

        }

        //allow/disallow remove all entries from this cache!!
        boolean allowClearFlag = false;
        SSMCache ssmCache = new SSMCache(object, expiryTimeInSeconds, allowClearFlag); 

        return ssmCache;

    }

    private CacheConfiguration getNewCacheConfiguration() 
    {
        CacheConfiguration ssmCacheConfiguration = new CacheConfiguration();
        ssmCacheConfiguration.setConsistentHashing(true);
        //ssmCacheConfiguration.setUseBinaryProtocol(true);
        return ssmCacheConfiguration;
    }

}
  1. ОК, мы готовы использовать наш настроенный кеш.
  2. Примеры методов в другом классе для чтения из кеша и удаления из кеша
@Cacheable(value="dummycache, key="#givenId.concat('-dmy')", unless="#result == null")
    public String getDummyDataFromMemCached(String givenId)
    {
        logger.warn("getDummyDataFromMemCached: Inside DUMMY method to actually get data");
        return "Sample-" + String.valueOf(givenId);
    }
    @CacheEvict(value="dummycache",key="#givenId.concat('-dmy')")
    public void removeDummyDataFromMemCached(String givenId)
    {
        //Do nothing
        return;
    }
  1. Обратите внимание, что мы добавили суффикс к ключам kache. Поскольку Memcached не поддерживает кеш-зоны, в конечном итоге "dummycache" и "testcache" не остаются отдельными на одном сервере. (Они могут остаться отдельными с другой реализацией кеша). Следовательно, чтобы избежать конфликта, мы добавляем уникальный суффикс к ключу кеша.

  2. Если вы хотите кэшировать объекты вашего собственного класса, убедитесь, что они сериализуемы. Просто измените определение своего класса на "XYZ реализует Serializable".

Другие вопросы по тегам