Невозможно получить хороший пример использования memcached из загрузки Java
Я использую Java-загрузку для моей разработки. Сейчас я использовал EhCache для кеширования, он поддерживается напрямую из загрузки Java. Это "внутрипроцессный" кэш, т.е. становится частью вашего процесса. Пока все хорошо. Но мой сервер будет работать на нескольких узлах в ближайшем будущем. Следовательно, вы хотите переключиться на Memcached в качестве общего уровня кэширования.
Потратив достаточно времени, я не смог получить хороший пример использования Memcached из java boot. Я посмотрел на " Simple Spring Memcached", который приближается к моему требованию. Но все же это дает пример использования конфигурации XML в Spring. Загрузка Java не использует такую конфигурацию XML, насколько это возможно. По крайней мере, я не смог быстро сопоставить пример с java boot world.
Я хочу использовать Memcahed (напрямую или через уровень кеш-абстракции) из загрузки Java. Если кто-нибудь укажет мне на соответствующий пример загрузки java, это сэкономит мне много времени.
3 ответа
Вы также можете проверить библиотеку Memcached Spring Boot. Он использует реализацию Memcached для Spring Cache Abstraction.
Другими словами, вы используете ту же конфигурацию и те же аннотации, что и в любой другой реализации Spring Cache. Вы можете проверить здесь использование библиотеки.
Я уже принял ответ от @ragnor. Но я думаю, что я должен опубликовать полный пример здесь, который работал для меня.
- Убедитесь, что у вас включен кеш для вашего приложения, добавив @EnableCaching
- 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>
- Добавьте файл конфигурации для настройки конфигурации кэша 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;
}
}
- ОК, мы готовы использовать наш настроенный кеш.
- Примеры методов в другом классе для чтения из кеша и удаления из кеша
@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;
}
Обратите внимание, что мы добавили суффикс к ключам kache. Поскольку Memcached не поддерживает кеш-зоны, в конечном итоге "dummycache" и "testcache" не остаются отдельными на одном сервере. (Они могут остаться отдельными с другой реализацией кеша). Следовательно, чтобы избежать конфликта, мы добавляем уникальный суффикс к ключу кеша.
Если вы хотите кэшировать объекты вашего собственного класса, убедитесь, что они сериализуемы. Просто измените определение своего класса на "XYZ реализует Serializable".