Skip to main content
 首页 » 编程设计

python之memcached 使用 Django 监听 UDP

2024年10月24日35arxive

问题:我无法让 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辩论


类似的问题 - get() set() memcached listening on UDP using Python

请您参考如下方法:

就我能够探索图书馆而言 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 缓存后端。