See You Again

memcached缓存flag标记

今天要造一个缓存条目,发现应用set进去的是一个 Java 的序列化对象,这对于Python来说有点蛋疼了。

不过归根结底,缓存的 value 是一个二进制文本,把它拿出来掐头去尾就能得到完整的 value,然后再 set 回去。不过我 set 了多次,都不能被程序正常读取。通过对比前后的值,发现有一个地方不同——memcached的 FLAG 标记。

查看协议文档,FLAG 是一个16位的无符号整数,在缓存条目被 set 或者 get 的时候一起返回,属于自定义的一个标记值来着。而我用的 python-memcached 库并没有提供这个 FLAG 自定义的接口。查看实现,发现它是按照 value 的类型去自动匹配的:

  1. flags = 0
  2. if isinstance(val, six.binary_type):
  3. pass # 0
  4. elif isinstance(val, int):
  5. flags |= Client._FLAG_INTEGER # 2
  6. elif six.PY2 and isinstance(val, long):
  7. flags |= Client._FLAG_LONG # 4
  8. else:
  9. flags |= Client._FLAG_PICKLE # 1

这个库判断 value 是一个二进制类型,于是设置了 flag=0,而实际上我的 value 是一个 Java 的对象,应该当成 Client._FLAG_PICKLE (实际值是1)处理。

修改这个库的实现,终于可以被正常读取了。可能作者都没想到我会用 python 去 set 一个 java 对象吧!

2017-03-17 喜欢

Copyright © 2015-2018 转载请注明出处

回到顶部 ↑