2011-01-11 8 views
2

django 프로젝트에서 서버 제한으로 인해 memcached가 아닌 캐시 테이블을 사용하여 몇 가지 쿼리 만 캐시하면됩니다. 그 쿼리의Django에서 캐싱 쿼리

하나는 다음과 같습니다

이의 내가 Child 객체를 많이 가지고 Parent 객체를 가지고 있다고 가정 해 봅시다. 간단한 쿼리 parent.childs.all()의 결과를 저장해야합니다.

나는 그와 아무 문제가없고, 모든 것이 cache.get(key)None을 반환 계속 cache.set를 실행 한 후,

key = "%s_children" %(parent.name) 
value = cache.get(key) 
if value is None: 
    cache.set(key, parent.children.all(), CACHE_TIMEOUT) 
    value = cache.get(key) 

하지만 가끔은, 단지 때로는 cache.set이 아무것도하지 않는 것처럼 일부 코드 예상대로 작동합니다.

일부 테스트를 마친 후 parent.children.all().count() 값이 더 높을 때 cache.set이 작동하지 않는 것으로 나타났습니다.
즉, 내 안에 key (예를 들어) 600 개의 자식 개체가 저장되어있는 경우 제대로 작동하지만
하지만 1200 명의 자녀와는 작동하지 않습니다.

그래서 내 질문은입니다 : 키가 저장할 수있는 데이터에는 제한이 있습니까? 어떻게 무시할 수 있습니까?




두 번째 질문 :, 위의 코드, 또는 다음과 같은 일 "더 나은"입니다 방법은? cache.set이 작동하지 않는 경우

key = "%s_children" %(parent.name) 
value = cache.get(key) 
if value is None: 
    value = parent.children.all() 
    cache.set(key, value, CACHE_TIMEOUT) 

두 번째 버전은 오류가 발생하지 않습니다, 그래서 내 문제에 대한 해결 될 수 있지만 분명히하지 솔루션 수 있습니다.

일반적으로 내 버전에 대해 잊지 맙시다.

+1

업데이트 된 코드 관련 : 두 번째 버전이 더 좋습니다. 설정 또는 가져 오기를 호출 할 때마다 데이터를 염산 처리하고 Base64 인코딩하므로 호출을 최소화하면 성능이 향상됩니다. – Seth

답변

0

세 가지 가능성이 있습니다.

  1. 그것은 다음, 그것을 인코딩, 쿼리를 가져 매우 긴 시간이 소요 될 저장할 수 있습니다 첫 번째는 당신이 제한된 자원을 실행하고 있다고 말한 이후, 나에게 가장 가능성이 보인다 다시 - 너무 오랫동안 웹 서버 프로세스가 메모리가 부족하거나 시간이 초과되어 데이터가 저장되기 전에 종료됩니다.

  2. 또는 데이터베이스에 텍스트 열의 길이가 다소 제한되어 있고 1200 개의 base64로 인코딩 된 피클 링 된 개체를 저장하면이 제한을 초과 할 수 있습니다.

  3. 아마도 캐시 키가 255자를 초과합니다.

+0

1. 어쩌면,하지만 그렇게 생각하지 않아. 2. 이것은 실제로 가능합니다. 3. 내 캐시 키가 30자를 넘지 않기 때문에 이것을 버릴 수 있습니다. 그래서 나는 두 번째 것을 갈 것입니다 ... 이제 가능한 해결책을 찾아야합니다 ... – dolma33

+0

글쎄, 해결책은 쉽습니다 : 1200 데이터베이스 객체를 캐시하지 마라! 진지하게 - [페이지] (http://docs.djangoproject.com/en/dev/topics/pagination/). – Seth

0

memcached에 대한 멍청한 점 - 주어진 캐시 키에 저장할 수있는 항목에 대해 1MB 제한이 있습니다. 이 제한을 구성 할 수 있지만이 기본값이 사용자의 제어 밖에있는 서버에 배포하는 경우 코드의 이식성에 영향을 미칩니다.

참조 여기에 "데이터의 목록을 저장는"백엔드 MySQL을

+0

죄송합니다,하지만 memcached를 사용하지 않습니다. 대신 데이터베이스 테이블을 사용하고 있습니다. – dolma33

2

http://code.google.com/p/memcached/wiki/FAQ?

MySQL에서는 TEXT 필드 are limited to 65,000 bytes이지만 django는 값 필드에이 유형을 사용합니다.

INSERT & 데이터가 너무 크면 UPDATE 쿼리가 자동으로 실패합니다.

제 조언은 데이터를 작게 유지하는 것입니다. 전체 QuerySet을 저장하는 것은 과도한 것처럼 보입니다. 필수 입력란 만 저장할 수 있습니까? 필요한 필드가 아닌 전체 인스턴스를 가져옵니다이 쿼리

resultset = parent.children.values_list(*fields).all() 

처럼

.