Клиент Enyim Memcached не записывает и не читает данные - PullRequest
11 голосов
/ 17 декабря 2010

Я установил memcached в Windows как службу, прослушивая порт 11211 по умолчанию. Я знаю, что это работает, потому что я могу подключиться к серверу и без проблем выполнить команды get / set.

Затем я скачал клиент Enyim Memcached (Enyim.Caching.dll, версия 2.7) и написал простую тестовую программу:

var mcc = new MemcachedClientConfiguration();
mcc.AddServer("127.0.0.1:11211");
mcc.SocketPool.ReceiveTimeout = new TimeSpan(0, 0, 10);
mcc.SocketPool.ConnectionTimeout = new TimeSpan(0, 0, 10);
mcc.SocketPool.DeadTimeout = new TimeSpan(0, 0, 20);

using (MemcachedClient client = new MemcachedClient(mcc))
{
    client.Store(StoreMode.Set, "enyimtest", "test value");
    Console.WriteLine(client.Get<string>("enyimtest"));
}

Я знаю, что это правильно соединяется с моим сервером, так как вызов команды stats в telnet показывает увеличение количества соединений. Однако он не вызывает get или set, так как счетчики статистики cmd_get и cmd_set остаются постоянными. Вызов client.Get возвращает ноль.

Программа не дает никаких ошибок. Кто-нибудь знает, что может помешать клиенту Enyim работать в этой ситуации?

EDIT:

Похоже, это вызвано таймаутом. После того, как я настроил log4net для записи выходных данных клиента, я обнаружил, что он содержит следующее (в дополнение к другим элементам трассировки стека):

2010-12-17 14: 26: 37,579 [1] ОШИБКА Enyim.Caching.Memcached.MemcachedNode [(null)] - System.IO.IOException: Не удалось прочитать из сокета '172.23.0.100:11211'. Ошибка: TimedOut

2010-12-17 14: 26: 37,626 [1] WARN Enyim.Caching.Memcached.MemcachedNode.InternalPoolImpl [(null)] - Пометить узел 172.23.0.100:11211 как мертвый

Я все еще не понимаю, почему истекает время ожидания?

Ответы [ 2 ]

18 голосов
/ 17 декабря 2010

Примерно через час игры я нашел ответ.Я использовал Wireshark для просмотра сетевого трафика на сервер и с сервера.Я заметил, что при использовании клиента Enyim сообщения выглядели совсем не так, как при использовании telnet.В частности, я не мог прочитать команды протокола, передаваемые по проводам, при использовании клиента Enyim.

Поэтому я пришел к выводу, что клиент Enyim использовал другой протокол.

Второй протоколбыл добавлен на сервер memcached в версии 1.4, которая является двоичным протоколом.До этого поддерживался только текстовый протокол.Последним бинарным файлом Windows, который я могу найти для memcached, является файл Jellycan , и это только версия 1.2.6.

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

Я добавил следующую строку в свою тестовую программу, и все сразу заработало:

mcc.Protocol = MemcachedProtocol.Text;
1 голос
/ 22 сентября 2011

Я столкнулся с той же проблемой выше.Я тоже изо всех сил пытался найти более новую версию memcached для Windows, но в конце концов нашел ее.

Я поместил ссылки на последние двоичные файлы вместе с другими полезными ресурсами здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...