2013-04-24 2 views
11

REST API를 통해 장고 서버와 통신하는 iOS 앱이 있습니다. 대부분의 데이터는 단일 플랫 사전으로 렌더링되는 몇 가지 관련 모델을 포함하는 다소 큰 Item 객체로 구성되며이 데이터는 거의 변경되지 않습니다.Redis를 REST API의 중간 캐시로 사용

이 질문은 Postgres에서 문제가되지 않지만 JSON 응답을 생성하는 데는 상당한 시간이 걸리는 것으로 나타났습니다. 반면에 항목 모음은 사용자별로 다릅니다.

Item 객체에 대한 사전을 만들어 JSON 문자열로 저장하는 렌더링 시스템에 대해 생각했습니다.이 방법으로 우리는 직접 redis에서 API를 제공 할 수 있습니다 (예 : HMGET (사용자 라이브러리의 항목 ID) 빠르게 렌더링되며 "렌더링 된 인스턴스"를 재생성하는 것이 상대적으로 쉽습니다. 기본적으로 두 개의 post_save 신호가 있습니다.

이 디자인이 얼마나 좋은지 궁금합니다. 거기에 큰 결함이 있습니까? 아마도 더 좋은 방법이있을 것입니다. 작업은?

+0

json 응답의 크기는 얼마이며 json을 덤프하는 데 얼마나 걸립니까? –

+0

testypie와 django-rest-framework가 모두 MBPr에서 최대 1 초 동안 렌더링하는 중첩 된 dicts로 20 개의 키로 약 300 개의 dicts를 말합니다. –

+0

cjson 또는 ultrajson을 이미 사용하려고 했습니까? –

답변

16

확실히 우리는 우리 회사에서 JSON이 아니라 RESTful 요청을위한 백엔드 데이터베이스에서 생성 된 큰 XML 문자열을 저장하기 위해 Redis를 사용하여 동일한 작업을 수행합니다. 네트워크 홉 및 오버 헤드

이 당신이 레디 스를 사용하는 처음 몇 가지 유의해야 할 ...

전용 레디 스 서버
레디 스는 단일 스레드이고있는 전용 서버에 배포해야 충분한 CPU 전력. 앱이나 데이터베이스 서버에이를 배포하는 실수를 저 지르지 마십시오.

고 가용성
고 가용성을 위해 마스터/슬레이브 복제로 Redis를 설정하십시오. Redis cluster에 많은 진전이 있었으므로 HA에 대해서도 확인하고 싶을 것입니다.

캐시 히트/미스
캐시 연결이 죽었거나 예외가 발생했을 경우 바로 데이터베이스에 기본 요청을 실패하지 않는다 "히트"에 대한 레디 스에 의하면, 캐싱은 데이터베이스가 항상 최후의 수단으로 사용될 수 있기 때문에 항상 '최선의 노력'이되어야합니다.

+0

팁 주셔서 감사합니다! Redis 서버에 어떤 종류의 부하가 있습니까? 우리는 이제 막 시작했는데 하나의 EC2 인스턴스로 충분하다고 여겨집니다. –

+0

Redis가 마지막 병목 지점이됩니다. Redis 서버는 RedHat Linux Enterprise에서 1 개의 듀얼 코어 CPU/4GB RAM으로 실행됩니다. 테스트 결과 25K는 2 위, 2 배는 글을 기반으로 한 페이로드 (25-100Kb)를 기준으로 작성되었으며 Redis는 땀을 흘리지 않습니다. 그것은 완전히 엉덩이를 걷어차. – raffian