Enyim Memcached Client不会写入/读取数据

时间:2010-12-17 13:12:50

标签: c# memcached

我已经在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以捕获客户端的日志输出后,我发现它包含以下内容(除了其他堆栈跟踪项):

  

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 个答案:

答案 0 :(得分:18)

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

因此,我得出结论,Enyim客户端使用的是不同的协议。

在版本1.4中的memcached服务器中添加了第二个协议,这是二进制协议。在此之前,仅支持文本协议。我可以为memcached找到的最新Windows二进制文件来自Jellycan,它只是版本1.2.6。

Enyim客户端默认配置为使用二进制协议,我的服务器忽略了该协议,因为它无法理解。

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

mcc.Protocol = MemcachedProtocol.Text;

答案 1 :(得分:1)

我遇到了同样的问题。我也很难为Windows找到更新版本的memcached,但最终确实找到了一个。

我已将链接添加到最新的二进制文件以及其他有用的资源here