c++与java共用memcached的问题

最初使用的是danga的memcachedClient,处理单一语言对memcache的数据存储没有遇到问题,后来由于业务需要,要由C++存储数据,JAVA负责取数据。Memcache有二进制和文本两种存储方式,我们统一使用二进制,C++侧存入序列化之后的序列,我们JAVA侧取到数据后进行反序列化,这时danga的bug就暴露出来了,无法取到memcache服务器中由C++侧放入的数据。于是我们放弃danga,改用性能更高更强大的xmemcache。

         Xmemcache无需设置使用二进制还是文本方式,它会自动判断并成功存取。由于数据中存在汉字,我们统一使用GBK编码存取数据,给XMemcachedClient设置Transcoder属性即可,即

memclient.setTranscoder(new StringTranscoder("gbk"));

这样对于memcache中的二进制序列,就可以作为字符串的格式获取到,之后再进行反序列化即可。

事情并没有就此结束,我们不仅仅需要读取C++侧存入的序列,更有原本就需要自行存取的JAVA对象。使用StringTranscoder仅仅用于字符串的存取,若想要存入JAVA对象它是办不到的,会提示你要存入的这个对象无法强转为String类型。我们发现,StringTranscoder是Transcoder的一个子类,Transcoder下面还有好多其他子类。那其中应该总有一个是允许我们存取JAVA对象的吧。没错,就是它,SerializingTranscoder。不论存取的是JAVA对象还是序列化后的字节,它都能坦然应对。不过它的构造方法里不含参数,需要通过设置其charset属性来设置编码,即

SerializingTranscoder transcoder = new SerializingTranscoder();

transcoder.setCharset("GBK");

memclient.setTranscoder(transcoder);

至此,大功告成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值