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,
}
}