2

问题:我无法memcached收听,无法与 DjangoUDP一起工作( )。get set delete


正如我在上一个问题UDP 11211中提到的那样,我只让 memcached 监听。到目前为止我已经尝试过:

1.CACHES设置使用python-memcachedPython绑定。get 和 set 不适用于简单的设置 ie '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使用pylibmcPython绑定:

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

PS不要在TCPvsUDP辩论中让它成为 memcached


一个类似的问题 - get() set() memcached 使用 Python 监听 UDP

4

1 回答 1

2

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

我已经跟踪了缓存调用getlibmemcached我发现了以下代码

    ...
    if (memcached_is_udp(ptr))
    {
      return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
    }
    ...

这与您的错误一致,因为pylibmc的方法使用上面的代码( )get映射到文件中的libmemcached的方法。memcached_get/libmemcached/get.cc

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

尽管如此,set正如我观察到在调试模式下运行memcached一样,该操作似乎运行良好。

我还尝试为缓存混合 TCP/UDP 提供不同的位置((PROTOCOL + IP + PORT) ,在LOCATION字段中由;分隔),但该库也不支持混合协议并返回错误。

    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

更新python-memcached-udp现在是一个 pip 包。如果需要,它的管理器是开放的,可以添加更多功能。如果您有兴趣,我们绝对可以使用 UDP 为 Memcached 创建一个新的 Django 缓存后端。

于 2016-04-07T22:54:13.633 回答