memcached listeing en UDP con Django

Pregunta : No puedo hacer que memcached escuche en UDP , para trabajar ( get set delete ) con Django.


Tengo el memcached escuchando solo en UDP 11211 , como he mencionado en la pregunta anterior . Lo que he intentado hasta ahora:

1. CACHES de CACHES para utilizar el enlace de Python con python-memcached python. get and set no funcionó con configuraciones simples, es decir, 'LOCATION': '127.0.0.1:11211' , así que intenté especificar udp explícitamente (usando esta mención como la razón):

 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'udp:127.0.0.1:11211', 'TIMEOUT': None, } } 

dio

ValueError: Unable to parse connection string: "udp:localhost:11211"

2.Ajuste de CACHES para utilizar el pylibmc Python pylibmc :

 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': 'udp:127.0.0.1:11211', 'TIMEOUT': None, } } 

El servidor funcionó bien – para verificar aún más:

 >>> import django >>> from django.core.cache import cache >>> cache.set('udp_key', 12) >>> cache.get('udp_key') Traceback (most recent call last): File "", line 1, in  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 No lo conviertas en un memcached en TCP vs UDP debate


Una pregunta similar: get () set () memcached escuchando en UDP usando Python

Hasta donde he podido explorar la biblioteca libmemcached que utiliza pylibmc, no es compatible con las operaciones de get con UDP.

He rastreado la llamada de caché para get a libmemcached y he encontrado el siguiente código :

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

eso coincide con su error, ya get método get de pylibmc se asigna al método memcached_get libmemcached en el archivo con el código anterior ( /libmemcached/get.cc ).

Instalé y configuré el mismo entorno en mi propia máquina y obtuve resultados idénticos.

Sin embargo, la operación de set parece funcionar perfectamente, ya que he observado ejecutar memcached en modo de depuración.

También he intentado proporcionar ubicaciones diferentes ((PROTOCOL + IP + PORT) separadas por ; en el campo UBICACIÓN ) para la memoria caché que mezcla TCP / UDP, pero la biblioteca NO SOPORTA tampoco los protocolos de mezcla y devuelve un error.

  CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': 'udp:127.0.0.1:11211;127.0.0.1:11211', 'TIMEOUT': None, } } 

Todos los hechos anteriores están confirmados por la documentación de libmemcached .

La opción de usar django.core.cache.backends.memcached.MemcachedCache como backend también se descarta ya que solo usa sockets TCP ( SOCK_STREAM ) para conectarse a memcached .

ACTUALIZACIÓN : python-memcached-udp ahora es un paquete pip. Su mantenedor está abierto para agregar más características si es necesario . Si está interesado, definitivamente podríamos trabajar en la creación de un nuevo backend de caché Django para Memcached con UDP.