2011-01-27 2 views
0

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

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

+2

Автор _ "' search_result', в данном случае, виноград "_, вы имеете в виду' search_key'? Ключ, такой как «виноград», уже является строкой, поэтому не должно быть никаких проблем с его использованием в качестве ключа кэш-памяти. Вы можете добавить префикс для предотвращения конфликтов, если вы также используете кеш для другого контента. –

+0

Правильно, ваш код как должен работать. –

ответ

3

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

Одно ограничение с 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 - улучшенный backcache кэша кэша для Django. Он обеспечивает четыре основных преимущества по сравнению с встроенным кешем встроенного кэша Django:

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

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

Смежные вопросы