Подтвердить что ты не робот

Клиент Enyim Memcached не записывает и не считывает данные

Я установил 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 возвращает null.

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

EDIT:

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

2010-12-17 14: 26: 37,579 [1] ERROR 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)] - Маркировка node 172.23.0.100:11211 как мертвая

Я до сих пор не понимаю, почему это тайм-аут, хотя?

4b9b3361

Ответ 1

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

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

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

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

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

mcc.Protocol = MemcachedProtocol.Text;

Ответ 2

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

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