2012-01-05 2 views
1

У нас есть 2 сервера приложений (coldfusion/Java) и один memcached. Я хочу настроить мой сервер/клиент memcached. Когда сервер 1 добавляет значение для ключа, он должен быть доступен также для сервера 2. И наоборот.Один сервер Memcached для многих клиентов

Теперь, когда я добавляю значение для ключа на сервере 1, он не доступен для чтения или редактируется на втором сервере. Как установить его

Я использую spymemcached как клиентскую библиотеку.

Спасибо за вашу помощь

+0

Прежде всего я хочу отметить, что оба Memcached и spymemcached очень надежны и используются тысячи людей каждый день. Вы также пытаетесь сделать что-то очень простое, что было бы легко поймано во время тестирования или spymemcached или memcached, что заставляет меня думать, что в вашем коде есть ошибка. Можете ли вы разместить здесь код? Также, если вы используете серию 2.7 spymemcached, вы можете вызвать функцию getStatus() из Future, возвращенную вам, чтобы узнать, была ли ошибка в вашем запросе. – mikewied

ответ

0

Все было настроено правильно, но установка сложного значения (Structure или Array) сделала эти пары ключ/значение недоступными для другого сервера. Теперь я сериализую все мои значения в JSON, и он отлично работает. Возможно, в версии 1.2.5 Memcached она изменена, но для версии 1.2.6 сериализация значений - хороший способ ее исправления.

<!--- Setting up Memcached Client ---> 
<!--- Add code in OnApplicationStart in Application.cfc ---> 
<cfset AU = createObject("java", "net.spy.memcached.AddrUtil").init() /> 
<cfset Application.MemCacheD = createObject("java", "net.spy.memcached.MemcachedClient").init(AU.getAddresses("127.0.0.1:11211")) /> 
<!--- Adding values: ---> 
<cfset memCacheName = "myKey" /> 
<cfset myValue = StructNew() /> 
<cfset myValue['var1'] = 'var1 value' /> 
<cfset Application.MemCacheD.add(memCacheName, 3600, serializeJSON(myValue)) /> 
<!--- Getting values: ---> 
<cfset memCacheName = "myKey" /> 
<cfset MemCachedRet = Application.MemCacheD.get(memCacheName) /> 
<cfif isDefined('MemCachedRet')> 
    <!--- value is available from mamcached ---> 
<cfelse> 
    <!--- get value from db and save to memcached ---> 
</cfif> 
0

Либо:

A. Вы не используете один и тот же ключ для сервера 1 и сервера 2 для того же объекта.

ИЛИ

B. Вы не разговариваете с тем же Memcached, например, для сервера 1 и сервера 2

ИЛИ

C. Вы дали такую ​​короткий срок службы на объекте, что он истек прежде чем другой сервер сможет использовать его.

+0

A - ключи одинаковы B - есть только один экземпляр memcache C - продолжительность жизни - 3600, а значение доступно на первом сервере – Bonanza

+0

Я утверждаю, что есть ошибка где-то. Предполагая, что вы используете стабильные релизы Memcached и Spymemcached, это не оставляет много места для маневра. Я отступил назад и вернусь к основам. Сделайте простой Java-класс с основным, который вставляет/извлекает значения. Запустите его на разных машинах, чтобы убедиться, что он работает. Используйте Wireshark как Абсолютно уверенный, что вы передаете тот же ключ. Используйте средства командной строки, доступные для memcached для проверки содержимого. Например, вставьте одно и то же значение с обоих серверов и запустите «элементы статистики». Имеет ли он 1 ключ или 2? – rfeak

+0

есть только один ке, на данный момент «тест». Я вставляю значение на один сервер, а другой - «неопределенный».Когда я пытаюсь перезаписать его с помощью ADD на другом сервере, я получаю статус «OperationStatus success = false: NOT_STORED». – Bonanza

0

Похоже, что это довольно молодая реализация Memcached, это может быть ошибка. Вы можете отправить его здесь: http://code.google.com/p/spymemcached/issues/list

Если вы не думаете, что это ошибка, можете ли вы опубликовать фрагмент кода, который вызывает звонки в Memcached?

Также имейте в виду, что memcached следует рассматривать как ненадежное и непостоянное хранилище. Вы должны написать свой код, как если бы вы ожидали, что он опустится и, возможно, даже вернется с пустыми результатами.

+0

это может быть ошибка в старой версии memcached engine ?? couse я использую его под окнами, и только рабочая версия, которую я нашел, - 1.2.4 (если я хорошо помню) – Bonanza