用Python写了一个计划任务,定时更新Memcached中一个key值,写的很happy,几分钟搞定。

然后在Java Servlet测试,代码写的也很happy,编译 – 刷新,一气呵成。

然后发现值一直是null,再tail日志看看,异常不断:

com.danga.MemCached.MemCachedClient Mon Jul 20 09:37:04 CST 2009 - ++++ exception thrown while trying to get object from cache for key: test_num
 com.danga.MemCached.MemCachedClient Mon Jul 20 09:37:04 CST 2009 - 3
 com.danga.MemCached.NestedIOException: 3
 at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1408)
 at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1270)

晕倒,记得以前为了让两个语言实现API读写共享,手动去修改了两个的API包,实现了中文互读写。难不成今儿个还要手动去搞一把?

然后手动试了下:

shell> telnet xxxxxx 11211
get test_num
VALUE test_num 4 2
23

经查证VALUE协议返回的是 key flags len \r\n value 这样的格式,大悟:原来flags不一样啊,Java里面对int型赋值以后flags是0,而Python里则不一样,两者序列化的东西不同啊。懒得去 折腾两者序列化有啥不同。来点直接的把。

然后打开Python Memcached API,大概578行_val_to_store_info方法里,可以看到flags部分,是根据变量类型进行定义的,isinstance(val, str) 如果是str则pass。

到这里就简单了,直接在py代码里:mc.set(‘test_num’, str(num))

Java读取OK。

Tagged with:  

SSH Tunnel && Memcached

On 2009/12/15, in Memcached, by admin

最近一台服务器放进了移动机房,需要访问原电信机房一台Memcached服务器,Memcached服务是以内网形式启动。

依靠google大神,搜索出解决思路,在本地起一个SSH链接,通过本地一个端口实现对另外机器的映射或者叫做转发。

上周本来已经搞定,本周突发灵异事件,竟然不管了,最后百般尝试,完成结果如下:

移动机器IP:220.xxx.xxx.xxx 电信机器IP:155.xxx.xxx.xxx

在移动机器上执行:

shell > ssh -N -f -L 11211:192.168.0.xxx:11211 [email protected]

11211:192.168.0.xxx:11211,格式为:本地端口:memcache启动的IP:端口
这里没有用RSA认证,就直接输入密码。-N 是不需要shell,-f 是程序后台执行,其他参数参见ssh –help。

shell > ps aux

可以看见进程已经在了,下面开始测试代码。

>>> import memcache
>>> mc = memcache.Client(['127.0.0.1:11211'],debug=True)
>>> print mc.get('name')
Tagged with:  
iBlog by PageLines

WP SlimStat