2012-01-27 4 views
3

내 장고 웹 앱에 리더 보드를 구현하고 있으며이를 수행하는 가장 좋은 방법을 모릅니다.웹 리더 보드

  1. 성능 충격적인 : 현재, 나는 단지에서 내 사용자를 주문 SQL을 사용하고있어, a는 리더, 그러나,이 두 가지 문제를 야기합니다. 몇 백 명의 사용자에게만 확장을 시도했지만 순위를 계산하는 속도가 느리고 과도한 캐싱은 사용자가 리더 보드에 추가 된 후 순위를 확인해야하므로 짜증나게합니다.

  2. 전체 리더 보드 계산을 다시 수행하지 않으면 사용자에게 어떤 위치에 있는지 거의 알려지지 않습니다.

나는 배치하지 않았지만 리더 보드 대 95 % (아마도 실제로는 더 많음)의 리더 보드에 대한 업데이트가 약 5 %로 추산됩니다. 따라서 최근 아이디어는 사용자가 추가 될 때마다 리더 보드를 다시 계산하고 위치 필드를 쉽게 정렬 할 수 있으므로 사용자의 순위를 표시하기 위해 다시 계산할 필요가 없습니다.

그러나 여러 사용자가 동시에 커밋하는 경우 잠금이 충분하거나 순위가 올리면 문제가 될 수 있습니까? 또한이 리더 보드 전용으로 별도의 데이터베이스에 배치 할 계획입니다. 내가 redis에 대한 좋은 것들을 듣고 ...

이 문제를 해결하는 더 좋은 방법? (아무도 SO가 리더 보드를 만드는 방법을 알고 있습니까?)

답변

1

Redis에서 sorted sets의 개념을 이해하게 될 것입니다. D

내가 거기에 당신을 도울 것입니다 리더 라이브러리의 숫자를 작성했습니다
+0

감사합니다. , 내가 Redis에 대해 더 읽었을 때, 나는 그것이 내 문제에 대해 완벽하게 조정 된 것처럼 보였습니다. – paddymelon

1

사용자 ID와 사용자 점수를 저장하는 테이블을 만드십시오.

을 사용하여 리더 보드를 당긴 다음 사용자 이름이나 기타 필요한 항목을 메인 테이블에 가입하십시오.

테스트의 총 횟수가 방정식의 변수가 아니라면 순위 시스템의 계산은 각 사용자마다 동일해야하므로 개별 항목을 업데이트하면됩니다.

+0

고마워요,하지만 그게 내가 현재하고있는 일이고 너무 재미 있지 않아. 주로) a) 너무 천천히, 500-550의 장소를 잡고 싶을 때마다 순서대로 다시 계산해야하고 b) 사용자의 순위를 잡는 데 매우 짜증이납니다. 즉, 모든 것을 다시 주문해야합니다. – paddymelon

2

:

가 문제를 설명하는 단락을 놓치지 마세요. 즉각적으로 사용할 수있는 것은 python-leaderboard이며 이는 참조 구현 leaderboard ruby gem을 기반으로합니다. Redis 정렬 된 세트를 사용하면 리더 보드가 실시간으로 순위가 매겨지고 리더 보드에 많은 수의 멤버를 한 번에 삽입하기위한 성능 메트릭과 관련하여 리더 보드 페이지에 특정 섹션이 있습니다. 글을 파이프 라이닝하는 경우 약 30 초 만에 1 백만 명의 회원을 차지할 것으로 예상 할 수 있습니다.

데이터가 너무 자주 실시간으로 변경되는 것이 걱정된다면 마스터 - 슬레이브 구성에서 Redis를 작동시키고 리더 보드가 마스터에서 주기적으로 폴링 만하는 슬레이브에서 데이터를 가져 오도록 할 수 있습니다.

희망이 도움이됩니다.

관련 문제