2011-12-05 5 views
1

) 너무 광범위하거나 일반화하지 않고 물어 보는 것은 힘든 질문이므로이 질문이 너무 높은 수준 인 경우 미리 사과하십시오. & 답변 형식.스트림 기반 웹 사이트 - memcache 최적화 옵션 (

자주 업데이트되는 피드 유형 시스템 ('트위터'스타일)이 포함 된 시스템과 사용자 투표를 기준으로 항목의 순위를 지정하는 시스템에서 작업하고 있습니다. 이 시스템은 (대부분) innodb mysql 데이터베이스에 액세스하는 PHP로 작성된 json/restful API를 기반으로합니다. 데이타베이스 자체는 실제로 매우 고도로 최적화되어 잘 정규화되어 있습니다. 이 시스템은 또한 검색을 위해 스핑크스를 사용하고 일부 외부 대기열은 데이터 처리를위한 처리 시스템 인 &을 사용합니다.

내 질문은 : 누구든지 데이터베이스 테이블 관계에 의존하는 시스템에 memcache를 구현하는 방법에 대한 제안이 있습니까?

예 : '인기있는 목록'은 누군가가 항목에 투표 할 때마다 계산되는 순위를 기반으로합니다. 누군가 투표를하면 항목에 대해 새로운 '순위'가 계산되고 mysql 데이터베이스에 정수로 저장됩니다.

몇 분마다이 항목 목록을 캐시하기 위해 cron 작업과 같은 것을 작성하는 것이 더 효율적일까요? 따라서 DB를 덜 자주 방문하십시오 - 또는 - DB에서 'id'를 가져 오는 것이 합리적일까요? 목록을 캐싱하는 대신 항목 데이터를 캐시하고 목록의 각 항목에 대한 메모리에서 데이터를 개별적으로 가져옵니다.

커브 볼은 각 항목에 대해 API 호출이 사용자가 항목에 투표했는지 여부도 반환해야하는지 여부도 반환해야합니다 (캐시 될 수도 있지만 캐시해야 할 항목을 캐시하기가 어렵습니다). 에 대한.

저는 심령 체조가 너무 심해서 너무 많이 업데이트 된 데이터에 너무 많이 의존 할 때 어떤 데이터가 실제로 의미가 있는지 또는 캐시 할 수 있는지 파악하려고합니다.

어느 쪽이든 물어 보는 것이 올바른 질문인지 잘 모르겠지만, 정적 요소가 거의없는 응용 프로그램에 대한 캐싱을 다루는 많은 경험을 가진 사람이라면 어떤 통찰력을 원할 것입니다.

여담으로

는, 나는 심각하게 순위 업데이트, 대신 상대 레디 스 목록을 업데이트하는 데이터베이스를 즉 ... '평가 항목'피드를 관리하는 레디 스를 사용하는 대신 타격에보고 생각했다. 나는 redis로 작업하는 데 조금 시간을 할애했기 때문에 확장 성이 뛰어난 시스템에서이 문제를 처리하는 것이 최선의 방법이라고 100 %는 아닙니다.

답변

1

여기에는 중요한 항목 인 pub/sub가 있습니다. 이렇게하면 이벤트와 같은 것을 게시하고 모든 청취자에게 즉각적인 통지를받을 수 있습니다 (확장 성이 뛰어남). 또한 다양한 "* ex"연산 (원자력, 존재 테스트) - SETEX, SETNX 등등 원자 목록 교환 등이 있습니다.

개인적으로, 나는 redis가 당신의 시나리오를 제공하기 위해 많은 것을 가지고 있다고 생각합니다.

+0

흠 ... 당신은 redis와 관련하여 여기에 더 관심을 갖게되었습니다. 내 경우, 'vote'는 이벤트이고, 알고리즘은 핸들러이고 redis는 결과를 저장할 것입니까? 높은 수준의 개념을 이해할 수 있다고 생각하지만, 기능적 수준에서 볼 때 투표가 실행될 때마다 데이터베이스를 못 박는 대신 가장 효과적인 방법으로 '인기/인기있는'목록이 요청됩니다. –

+0

@Jonathan 우리는 여기 여러 가지 방법으로 사용합니다 - 때로는 이벤트 자체로도 사용하지만 때로는 redis를 사용하여 캐시 가능한 스냅 샷을 저장하고 변경/무효화 할 때마다 메시지를 보냅니다.나는 완전한 홍채 전문가 (비록 내가 처음부터 그것을 위해 클라이언트를 작성했지만 - BookSleeve)라고 주장하지는 않지만, 조사할만한 가치가 있다고 생각한다. –

+0

감사합니다. marc! 당신은 나에게 redis가 어떻게 작용할 수 있는지에 대해 더 생각해 보았습니다 ... 당신의 피드백에 정말 감사드립니다! –