Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django在UDP上进行memcached侦听_Python_Django_Udp_Python Memcached_Pylibmc - Fatal编程技术网

Python 使用Django在UDP上进行memcached侦听

Python 使用Django在UDP上进行memcached侦听,python,django,udp,python-memcached,pylibmc,Python,Django,Udp,Python Memcached,Pylibmc,问题:我无法获得memcached监听UDP,无法与Django一起工作(get>>从django.core.cache导入缓存 >>>cache.set('udp_key',12) >>>cache.get('udp_key') 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 get第84行的文件“/usr/lib/python2.7/site packages/django/core/cache/backends/memcached.py” val=self.\u cache.get(

问题:我无法获得
memcached
监听
UDP
,无法与Django一起工作(
get
删除


我让memcached只在
UDP
11211
上侦听,正如我在中提到的。到目前为止,我所尝试的:

1.将
缓存设置为使用
python memcached
python绑定。get和set不适用于简单的设置,例如
“位置”:“127.0.0.1:11211”
,因此尝试显式指定
udp
(以此作为基本原理):

给出:

值错误:无法分析连接字符串:“udp:localhost:11211”

2.将
缓存设置为使用
pylibmc
Python绑定:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': 'udp:127.0.0.1:11211',
        'TIMEOUT': None,
    }
}
服务器运行正常-要进一步验证:

>>> import django
>>> from django.core.cache import cache
>>> cache.set('udp_key', 12)
>>> cache.get('udp_key')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/django/core/cache/backends/memcached.py", line 84, in get
    val = self._cache.get(key)
NotSupportedError: error 28 from memcached_get(:1:udp_key): ACTION NOT SUPPORTED
导入django >>>从django.core.cache导入缓存 >>>cache.set('udp_key',12) >>>cache.get('udp_key') 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 get第84行的文件“/usr/lib/python2.7/site packages/django/core/cache/backends/memcached.py” val=self.\u cache.get(键) NotSupportedError:memcached_get(:1:udp_key)中的错误28:不支持操作

p.S.不要让它成为
TCP
UDP
辩论中的memcached



类似的问题-

据我所知,使用的库不支持UDP的
get
操作

我跟踪了对
get
libmemcached
的缓存调用,发现:

这与您的错误一致,因为pylibmc的
get
方法映射到文件中包含上述代码的libmemcached
memcached\u get
方法(
/libmemcached/get.cc

我在自己的机器上安装和配置了相同的环境,得到了相同的结果

尽管如此,
set
操作似乎工作得很好,正如我观察到的那样,在调试模式下运行memcached

我还尝试为混合TCP/UDP的缓存提供不同的位置(位置中用分隔的(协议+IP+端口);),但库也不支持混合协议,并返回错误

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': 'udp:127.0.0.1:11211;127.0.0.1:11211',
            'TIMEOUT': None,
        }
    }
所有先前的事实均已由以下文件证实:

使用
django.core.cache.backends.memcached.MemcachedCache
作为后端的选项也被放弃,因为它只使用TCP套接字(
SOCK\u STREAM
)连接到memcached


更新:现在是一个pip包。它的mantainer。如果您感兴趣,我们绝对可以为使用UDP的Memcached创建一个新的Django缓存后端。

感谢您深入研究。很明显,即使pylibmc也不支持get,现在的问题仍然是——我们如何让UDP上的memcached使用一些生产级软件包与Django一起工作。我发现这可以作为一个起点。我已经将其分叉以支持python 3。如果您感兴趣,我们可以编写一个使用它的django缓存后端。
    ...
    if (memcached_is_udp(ptr))
    {
      return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
    }
    ...
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': 'udp:127.0.0.1:11211;127.0.0.1:11211',
            'TIMEOUT': None,
        }
    }