2011-01-27 3 views
0

지금 당장은 API에서 정보를 가져오고 있습니다. 다시 정보를 캐시하고 싶습니다. 따라서 계속해서 서버를 공격하고 최대 API 호출 요청을 사용하지 않아도됩니다. 바로 지금, 사용자는 "포도"와 같은 특정 키워드를 검색 할 수 있습니다. "cache.set (search_result, info_retrieved, 600)"를 호출하여 검색된 문자열을 캐시하고 싶습니다. "search_result"는 사용자의 검색 결과입니다. 이 경우 "포도". 키가 사용자의 검색 결과 인 "포도"가 되길 원합니다. 캐시는 문자열을 키로 요구하므로이 작업을 수행 할 수 없습니다. 이 문제를 어떻게 해결할 수 있습니까? 정보가 너무 자주 업데이트되기 때문에 데이터베이스를 사용할 수 없습니다.Django Caching - 사용자 정의 키 이름을 생성하는 방법?

데이터베이스를 사용할 수는 있지만 정보를 쓰고 몇 분 후에 삭제하면 비실용적입니다. 그래서, 나는 일시적으로 캐시하고 싶습니다.

+2

_ "'search_result",이 경우 grapes "_,'search_key'를 의미합니까? "포도"와 같은 키는 이미 문자열이므로 캐시 키로 사용하는 데 문제가 없어야합니다. 다른 콘텐츠에 대해 캐시를 사용하는 경우 접두사를 추가하여 충돌을 방지 할 수 있습니다. –

+0

맞아, 귀하의 코드가 작동해야합니다. –

답변

3

Shawn Chin이 언급했듯이 이미 검색 쿼리의 문자열 "version"이 있어야하며 이는 캐시 키로 잘 작동합니다.

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는 Django를위한 개선 된 memcached 캐시 백엔드입니다. Django에 내장 된 캐시 백엔드보다 4 가지 주요 이점을 제공합니다.

  • pylibmc를 지원합니다.
  • memcached로 보내기 전에 각 키에서 기능을 실행할 수 있습니다.
  • 무한 타임 아웃으로 캐시 키 설정을 지원합니다.
  • 천둥 번개 문제를 완화합니다.

또한 꽤 좋은 기본값이 있습니다. 기본적으로 각 키에서 실행되는 함수는 키를 해시하고 버전을 지정하고 변형합니다. 나중에 그 이상.

관련 문제