2016-04-02 3 views
2

Question: Je ne suis pas en mesure d'obtenir memcached écouter sur UDP, au travail (getsetdelete) avec Django.listeing memcached sur UDP avec Django


J'ai l'memcached écoute uniquement sur UDP11211, comme je l'ai mentionné dans le previous question. Ce que j'ai essayé jusqu'à présent:

1.Mise CACHES utiliser python-memcached Python obligatoire. get et set n'a pas fonctionné avec des réglages simples c.-à-'LOCATION': '127.0.0.1:11211', donc essayé explicitement préciser udp (en utilisant cette mention comme la raison):

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

a donné:

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

2.Verr CACHES pour utiliser pylibmc Reliure Python:

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

Le serveur a fonctionné très bien - continuer à vérifier:

>>> 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 

post-scriptum Ne faites pas un memcached sur TCP vs UDP débat


Une question similaire - get() set() memcached listening on UDP using Python

Répondre

2

Pour autant que je l'ai pu explorer la bibliothèque libmemcached que pylibmc utilisations ne pas soutenir get opérations avec UDP.

J'ai retracé l'appel cache get jusqu'à libmemcached et je l'ai trouvé the following code:

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

qui coïncide avec votre erreur pylibmc 'méthode de get est mis en correspondance libmemcached' s memcached_get méthode dans le fichier avec le code ci-dessus (/libmemcached/get.cc).

J'ai installé et configuré le même environnement dans ma propre machine et j'ai des résultats identiques.

Néanmoins, l'opération set semble fonctionner parfaitement comme j'ai observé en cours d'exécution memcached en mode de débogage.

J'ai également essayé de fournir des emplacements différents ((PROTOCOLE + IP + PORT) s séparés par , dans le LOCALISATION champ) pour le cache de mélange TCP/UDP, mais la bibliothèque ne supporte pas le mélange des protocoles soit et renvoie une erreur.

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

Tous les faits précédents sont confirmés par la documentation de libmemcached.

La possibilité d'utiliser django.core.cache.backends.memcached.MemcachedCache comme back-end est également mis au rebut car il utilise uniquement les sockets TCP (SOCK_STREAM) pour se connecter à memcached.

MISE À JOUR: python-memcached-udp est maintenant un paquet pip. Son mantainer is open to add more features if needed. Si vous êtes intéressé, nous pourrions certainement travailler sur la création d'un nouveau backend de cache Django pour Memcached avec UDP.

+0

Merci d'avoir creusé dedans. Comme il est clair, même pylibmc ne supporte pas get, maintenant la question demeure - comment pouvons-nous avoir memcached sur UDP pour travailler avec Django, en utilisant un paquet de niveau de production. –

+0

J'ai trouvé https://github.com/idanmo/python-memcached-udp qui pourrait être utilisé comme point de départ. Je l'ai forké pour supporter python 3 sur https://github.com/mfeliu/python-memcached-udp. Si vous êtes intéressé, nous pourrions écrire un backend de cache de django qui l'utilise. –