Memcache本地SET命令失效但远程正常问题求助
本地Memcache SET命令失效的排查方案
1. 换行符格式不匹配
Memcache协议强制要求用**CRLF(\r\n)**作为每一行的结束标记,不能只用LF(\n)。远程测试时网络链路可能自动修正了换行格式,但本地Socket是原封不动发送你写的字符,服务器会一直等待完整的换行标识,因此无响应。
- 检查代码里的字符串,把命令行和数据行后面的
\n改成\r\n,比如写成:string command = "set mykey 0 0 18\r\n638555735305882673\r\n"; - 如果是分两次发送命令和数据,每一次都要添加
\r\n。
2. 本地Socket发送缓冲未及时刷新
本地Socket存在小数据包合并机制(Nagle算法),如果分两次发送短内容,可能会被合并或者卡在缓冲里,导致服务器没收到完整的命令包。
- 用
NetworkStream发送的话,发送完成后记得调用Flush();如果直接用Socket.Send(),可以把命令和数据合并成一个字节数组一次性发送,避免分段传输的问题。
3. Memcache本地监听配置有问题
检查Memcache的启动参数,确认它是否监听了127.0.0.1或所有网卡(0.0.0.0)。有些默认配置可能只允许远程连接,本地连接虽能建立,但命令处理会出现异常。
- 启动Memcache时添加
-l 0.0.0.0(允许所有IP访问),或者明确指定-l 127.0.0.1;若是Windows服务,去配置文件中修改监听地址。
4. 本地安全软件拦截
虽然GET命令正常,但部分防火墙或杀毒软件会对本地Socket的写入操作做特殊过滤,导致SET命令的数据包被拦截。
- 临时关闭防火墙/安全软件测试,若SET命令恢复正常,就把Memcache和你的C#程序加入白名单。
快速验证方法
用telnet手动连接本地Memcache(默认端口11211)执行命令:
telnet localhost 11211 set mykey 0 0 18 638555735305882673
手动执行能返回STORED的话,问题出在你的C#发送逻辑;若手动也无响应,就是Memcache配置或本地环境的问题。
内容的提问来源于stack exchange,提问作者Dryzler
相关产品推荐
相关产品推荐

