memcached листинг по UDP с Джанго
Вопрос: я не могу получить memcached
слушая UDP
, работать (get
set
delete
с Джанго
У меня есть memcached, слушающий только на UDP
11211
, как я уже упоминал в предыдущем вопросе. Что я уже пробовал:
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.