我已经在Windows上将memcached作为服务安装了,并在默认端口11211上进行了监听。我知道这是可行的,因为我可以telnet到服务器并执行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"));
}

我知道这可以正确连接到我的服务器,因为在telnet中调用stats命令显示连接数量有所增加。但是,它不会调用get或set,因为cmd_getcmd_set统计信息计数器保持不变。对client.Get的调用返回null。

该程序不会以任何方式出错。有谁知道什么可以阻止Enyim客户在这种情况下工作?

编辑:

看起来这是由于超时引起的。配置log4net以捕获客户端的日志输出之后,我发现它包含以下内容(除了其他堆栈跟踪项):



我还是不明白为什么会超时呢?

最佳答案

经过一个小时左右的玩耍,我找到了答案。我使用Wireshark查看往返服务器的网络流量。我注意到使用Enyim客户端时,消息看起来与使用telnet时的消息完全不同。特别是,在使用Enyim客户端时,我无法读取线路上的协议(protocol)命令。

因此,我得出结论,Enyim客户端正在使用其他协议(protocol)。

在版本1.4中向内存缓存服务器添加了第二个协议(protocol),即二进制协议(protocol)。在此之前,仅支持文本协议(protocol)。我可以找到的用于memcached的最新Windows二进制文件是Jellycan中的一个,它仅为版本1.2.6。

Enyim客户端默认配置为使用Binary协议(protocol),由于无法理解,我的服务器只是忽略了该协议(protocol)。

我在测试程序中添加了以下行,然后一切立即开始工作:

mcc.Protocol = MemcachedProtocol.Text;

10-05 20:08