Memcached Client的序列化
如果我们需要往memcached中存储非基本类型的Object时
是需要对这个Object进行序列化的
不过,现在的memcached client都已经替你做了序列化和反序列化工作了
所以,我们在使用时,可以直接把Object传给它,让它来实现序列化和反序列化
比如,python的Client工具memcache.py中
折叠复制代码
- flags=0
- if isinstance(val, str):
- pass
- elif isinstance(val, int):
- flags |= Client._FLAG_INTEGER
- val="%d"% val
- # force no attempt to compress this silly string.
- min_compress_len=0
- elif isinstance(val, long):
- flags |= Client._FLAG_LONG
- val="%d"% val
- # force no attempt to compress this silly string.
- min_compress_len=0
- else:
- flags |= Client._FLAG_PICKLE
- file=StringIO()
- pickler=self.pickler(file,protocol=self.pickleProtocol)
- if self.persistent_id:
- pickler.persistent_id=self.persistent_id
- pickler.dump(val)
- val=file.getvalue()
可以看到,对于复杂的Object,它默认是调用cPickle来作为其序列化的工具的
当然,我们也可以在set之前,也可以使用marshal或其它的工具来自行序列化
java的spymemcached的Client库
折叠复制代码
- byte[]b=null;
- intflags=0;
- if(o instanceof String) {
- b=encodeString((String)o);
- } else if(o instanceof Long) {
- b=tu.encodeLong((Long)o);
- flags |= SPECIAL_LONG;
- .....
- } else {
- b=serialize(o);
- flags |= SERIALIZED;
- }
最后,它调用了serialize方法进行序列化的,再看serialize方法
折叠复制代码
- ByteArrayOutputStreambos=newByteArrayOutputStream();
- ObjectOutputStreamos=newObjectOutputStream(bos);
- os.writeObject(o);
- os.close();
- bos.close();
Java的另外一个memcached client:java_memcached-release_2.0.1中是用URLEncoder进行了编码处理
折叠复制代码
- private String sanitizeKey( String key ) throws UnsupportedEncodingException
- {
- return ( sanitizeKeys ) ? URLEncoder.encode( key, "UTF-8" ) : key;
- }
由于不同的Client实现的序列化方式不同,所以如果在不同的语言
如,java,python中使用同一个memcached来存取数据,可能会造成数据不一致的问题