我在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"));
}
Run Code Online (Sandbox Code Playgroud)
我知道这正确连接到我的服务器,因为stats在telnet中调用命令会显示连接数量增加.但是,它不会调用get或set,因为cmd_get和cmd_setstats计数器保持不变.调用client.Get返回null.
该程序没有任何错误.有谁知道什么可以阻止Enyim客户在这种情况下工作?
编辑:
看起来这是由超时引起的.在配置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标记为已死
我还是不明白为什么它会超时呢?
Ric*_*ett 18
经过一个小时左右的游戏,我找到了答案.我使用Wireshark来查看进出服务器的网络流量.我注意到在使用Enyim客户端时,消息看起来与使用telnet时的消息完全不同.特别是,在使用Enyim客户端时,我无法读取通过线路的协议命令.
因此,我得出结论,Enyim客户端使用的是不同的协议.
第二个协议被添加到版本1.4中的memcached服务器,这是二进制协议.在此之前,仅支持文本协议.我可以为memcached找到的最新的Windows二进制文件来自Jellycan,它只有版本1.2.6.
Enyim客户端配置为默认使用二进制协议,我的服务器忽略了它,因为它无法理解.
我在测试程序中添加了以下行,并立即开始工作:
mcc.Protocol = MemcachedProtocol.Text;
Run Code Online (Sandbox Code Playgroud)