使用Django在UDP上进行memcached列表



问题:我无法让memcached监听UDP,也无法与Django一起工作(get set delete)。


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

1.将CACHES设置为使用python-memcachedPython绑定。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设置为使用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

p.S.不要将其作为TCPUDP辩论上的内存缓存


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

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

我已经跟踪了从getlibmemcached的缓存调用,并发现了以下代码:

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

这与您的错误一致,因为pylibibmcget方法被映射到带有上述代码的文件中的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缓存后端。

相关内容

  • 没有找到相关文章

最新更新