Django Caching - Как генерировать пользовательские имена ключей? - PullRequest
0 голосов
/ 27 января 2011

Сейчас я получаю информацию из API, и я хотел бы кэшировать информацию, которую я получаю, поэтому мне не нужно постоянно подключаться к их серверу и использовать мои максимальные запросы вызовов API.Прямо сейчас пользователь может искать определенное ключевое слово, например «виноград», я хотел бы кэшировать полученную строку, вызывая «cache.set (search_result, info_retrieved, 600)», где «search_result» - результат поиска пользователя, вэтот случай "виноград".Я хочу, чтобы ключом был результат поиска пользователя - "виноград".Я не могу этого сделать, поскольку кеш требует, чтобы ключ был строкой.Как я могу обойти это?Я не могу использовать базу данных, потому что информация обновляется слишком часто.

Я мог бы использовать базу данных, но я бы записывал в нее информацию, а затем удалял ее через несколько минут, что кажется непрактичным.Итак, я просто хочу временно его кешировать.

1 Ответ

3 голосов
/ 28 января 2011

Как уже упоминал Шон Чин, у вас уже должна быть строка «версия» вашего поискового запроса, которая прекрасно работала бы как ключ кеша.

Одно ограничение с memcached (не уверенным в других бэкэндах) заключается в том, что определенные символы (особенно пробелы) недопустимы в ключах. Самый простой способ обойти это - хешировать ваш строковый ключ в шестнадцатеричный дайджест и использовать его в качестве ключа:

from hashlib import sha1
key = sha1('grapes').hexdigest() # '35c4cdb50a9a6b4475da4a66d955ef2a9e1acc39'

Если у вас могут быть разные результаты для разных пользователей (или на основании каких-либо критериев), вы можете пометить / обозначить / добавить ключ ключом строкового представления этой информации:

from hashlib import sha1
key = sha1('%s:%s:%s' % (user.id, session.sessionid, 'grapes')).hexdigest()

Вы также можете использовать django-newcache :

Newcache - улучшенный серверный кеш memcached для Django. Он обеспечивает четыре основных преимущества по сравнению со встроенным кешем Django:

  • Поддерживает pylibmc.
  • Позволяет запускать функцию для каждой клавиши перед отправкой в ​​memcached.
  • Он поддерживает установку ключей кэша с бесконечными таймаутами.
  • Это смягчает проблему стада громов.

Он также имеет довольно хорошие значения по умолчанию. По умолчанию функция, которая запускается для каждой клавиши, - это функция, которая хэширует, версии и разновидности клавиши. Подробнее об этом позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...