memcached листинг по UDP с Джанго

Вопрос: я не могу получить memcached слушая UDP, работать (getsetdelete с Джанго


У меня есть memcached, слушающий только на UDP11211, как я уже упоминал в предыдущем вопросе. Что я уже пробовал:

1.ЗАГРУЗКА CACHES использовать python-memcached Python привязка. получить и установить не работал с простыми настройками, т.е. '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 использовать pylibmc Привязка Python:

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 Не делайте это memcached на TCP против UDP обсуждение


Аналогичный вопрос - get() set() memcached слушает по UDP используя Python

1 ответ

Насколько я смог изучить библиотеку http://libmemcached.org/, которую использует pylibmc, не поддерживает get операции с UDP.

Я проследил вызов кеша get вплоть до libmemcached и я нашел следующий код:

    ...
    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 в режиме отладки.

Я также пытался указать различные местоположения ((PROTOCOL + IP + PORT), разделенные ; в поле LOCATION) для смешивания кэша TCP/UDP, но библиотека также НЕ ПОДДЕРЖИВАЕТ протоколы смешивания и возвращает ошибку.

    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. Его менеджер открыт для добавления дополнительных функций, если это необходимо. Если вам интересно, мы определенно могли бы поработать над созданием нового кеша Django для Memcached с UDP.

Другие вопросы по тегам