问题:我无法让 memcached 监听 UDP 工作(get set delete) 与 Django。
我的 memcached 只监听 UDP 11211,正如我在 previous question 中提到的那样.到目前为止我尝试了什么:
1.设置 CACHES 以使用 python-memcached Python 绑定(bind)。 get 和 set 不适用于简单的设置,即 'LOCATION': '127.0.0.1:11211',因此尝试明确指定 udp(使用此 mention 作为理由):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'udp:127.0.0.1:11211',
'TIMEOUT': None,
}
}
给予:
ValueError:无法解析连接字符串:“udp:localhost:11211”
2.设置CACHES使用pylibmc Python绑定(bind):
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 上的 memcached辩论
请您参考如下方法:
就我能够探索图书馆而言 libmemcached那pylibmc使用不支持使用 UDP 的 get 操作。
我已经追踪到 get 的缓存调用一直到 libmemcached 并且我找到了 the following code :
...
if (memcached_is_udp(ptr))
{
return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
}
...
这与您的错误一致,因为 pylibmc 的 get 方法映射到 libmemcached 的 memcached_get 方法在包含上述代码的文件中 (/libmemcached/get.cc)。
我在自己的机器上安装和配置了相同的环境,得到了相同的结果。
不过,set 操作似乎完美无缺,因为我观察到在 Debug模式下运行 memcached。
我还尝试为缓存混合 TCP/UDP 提供不同的位置(在 LOCATION 字段中用 ; 分隔的 (PROTOCOL + IP + PORT)s),但库也不支持混合协议(protocol)并返回错误。
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)连接到内存缓存。
更新:python-memcached-udp现在是一个 pip 包。它的维护者is open to add more features if needed .如果您有兴趣,我们绝对可以使用 UDP 为 Memcached 创建一个新的 Django 缓存后端。
