问题:我无法让memcached
监听UDP
,也无法与Django一起工作(get
set
delete
)。
正如我在上一个问题中提到的,我让memcached只在UDP
11211
上侦听。到目前为止我尝试过的:
1.将CACHES
设置为使用python-memcached
Python绑定。get和set不适用于简单的设置,即'LOCATION': '127.0.0.1:11211'
,因此尝试显式指定udp
(使用此项作为基本原理):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'udp:127.0.0.1:11211',
'TIMEOUT': None,
}
}
给出:
ValueError: Unable to parse connection string: "udp:localhost:11211"
2.将CACHES
设置为使用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
p.S.不要将其作为TCP
与UDP
辩论上的内存缓存
类似的问题-get()set()memcached使用Python 侦听UDP
据我所知,pylibibmc使用的库libmemcached不支持UDP的get
操作。
我已经跟踪了从get
到libmemcached
的缓存调用,并发现了以下代码:
...
if (memcached_is_udp(ptr))
{
return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
}
...
这与您的错误一致,因为pylibibmc的get
方法被映射到带有上述代码的文件中的libmemcached(/libmemcached/get.cc
)的memcached_get
方法。
我在自己的机器上安装和配置了相同的环境,得到了相同的结果。
尽管如此,set
操作似乎工作得很好,正如我在调试模式下运行memcached所观察到的那样。
我还尝试提供不同的位置((协议+IP+端口),用分隔位置字段中的strong>),但库也不支持混合协议,并返回错误。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': 'udp:127.0.0.1:11211;127.0.0.1:11211',
'TIMEOUT': None,
}
}
libmemcached的文档证实了之前的所有事实。
使用django.core.cache.backends.memcached.MemcachedCache
作为后端的选项也被放弃,因为它只使用TCP套接字(SOCK_STREAM
)连接到memcached。
UPDATE:python memcached udp现在是一个pip包。如果需要,它的manainer可以添加更多功能。如果您感兴趣,我们绝对可以为使用UDP的Memcached创建一个新的Django缓存后端。