zoukankan      html  css  js  c++  java
  • 解决python-memcache报错:“Unknown flags on get: 20”

    [本文出自天外归云的博客园]

    在使用python的pytho-memcache库时出现了一个问题,在调用get方法获取键值的时候报错:Unknown flags on get: 20

    在网上查了,发现一个人也遇到了同样的问题但没解决:Python 'Unknown flags on get' error while querying memcached

    通过排查源码逻辑,我发现并不是获取不到key的value,而是源码中对flags的相关处理逻辑导致没有返回memcache服务器的返回值。

    通过调试源码,定位问题出在memcache.py文件 > _recv_value方法 > 最后的else分支 只抛出了异常而没有指定返回值val导致,修改方法如下:

    def _recv_value(self, server, flags, rlen):
        rlen += 2  # include 
    
        buf = server.recv(rlen)
        if len(buf) != rlen:
            raise _Error("received %d bytes when expecting %d"
                         % (len(buf), rlen))
    
        if len(buf) == rlen:
            buf = buf[:-2]  # strip 
    
    
        if flags & Client._FLAG_COMPRESSED:
            buf = self.decompressor(buf)
            flags &= ~Client._FLAG_COMPRESSED
        if flags == 0:
            # Bare bytes
            val = buf
        elif flags & Client._FLAG_TEXT:
            val = buf.decode('utf-8')
        elif flags & Client._FLAG_INTEGER:
            val = int(buf)
        elif flags & Client._FLAG_LONG:
            if six.PY3:
                val = int(buf)
            else:
                val = long(buf)  # noqa: F821
        elif flags & Client._FLAG_PICKLE:
            try:
                file = BytesIO(buf)
                unpickler = self.unpickler(file)
                if self.persistent_load:
                    unpickler.persistent_load = self.persistent_load
                val = unpickler.load()
            except Exception as e:
                self.debuglog('Pickle error: %s
    ' % e)
                return None
        else:
            self.debuglog("unknown flags on get: %x
    " % flags)
            # 注释掉这行
            # raise ValueError('Unknown flags on get: %x' % flags)
            # 设定返回值
            val = buf
    
        return val

    问题就这样解决了。

    相关问题:https://github.com/linsomniac/python-memcached/issues/144

  • 相关阅读:
    BitmapDrawable
    Understanding Density Independence in Android
    HttpURLConnection
    [Unity3D]事半功倍:界面插件NGUI的使用教程与实例
    lua下标
    数组形参
    Hibernate的一级缓存
    必备技术
    idea 跳转实现类-快捷键
    JavaSE面试题:单例设计模式
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/9204431.html
Copyright © 2011-2022 走看看