2014-07-11 14 views
1

이 질문은 this one과 매우 유사하지만 그 답변은 없습니다. 나는 대답을 받기를 희망하면서 이것을 더 명확하게 게시했다.사용자가 따라 다니는 경우의 타임 라인 재구성

this presentation에 따르면 Twitter는 Redis의 각 개별 사용자의 타임 라인에 짹짹을 밀어 넣기위한 팬 아웃 방법을 사용합니다. 분명히,이 팬 아웃은 사용자가 트윗을 팔로우 할 때만 발생합니다.

전에 누군가를 따라 본적이없고 (역으로 타임 라인에 짹짹이 없다) 새로운 사용자가 누군가를 따라 가기로 결정했다고 가정합니다. 위의 방법을 사용하면 사용자가 트윗을 따라 가면서 타임 라인에 표시 할 항목이있을 때까지 기다려야합니다. 약간의 관찰 후에 이것은 그렇지 않다. Twitter는 사용자로부터 최신 트윗을 가져옵니다.

새로운 사용자가 5 명의 사용자를 추적한다고 가정 할 때 Twitter가 어떻게 구성하여 사용자의 타임 라인에 이러한 트윗을 구성 할 수 있습니까?

사용자가 이미 5 명의 사용자를 팔로우하고 타임 라인에서 해당 사용자의 짹짹 소리가 상당하다고 가정합니다. 그들이 다른 5 명의 사용자를 추적하면이 사용자의 개별 트윗이 Redis의 초기 사용자의 타임 라인에 올바른 순서로 삽입 된 방식은 무엇입니까? 더 중요한 것은 각 사용자로부터 얼마나 많은 것을 가져올 지 계산할 수 있다는 것입니다 (800 개의 트윗에서 타임 라인 작성).

답변

0

여기에 귀하의 질문을 잘 이해하면 어떻게 구현할 것인지에 대한 방법이 있습니다.

각 트윗을 해시로 저장하십시오. 해시의 핵심은 다음과 같을 수 있습니다. tweet:<tweetID>. 지정된 사용자의 트윗 ID를 user:<userID>:tweets이라는 정렬 된 세트에 저장합니다. 트윗의 점수를 유닉스 타임 스탬프로 설정하면 올바른 순서로 나타납니다. 사용자가 새로운 사람을 다음과 때 다음 명령 ZREVRANGEBYSCORE

ZREVRANGEBYSCORE user:<userID>:tweets +inf -inf LIMIT 0 800 

와 사용자에 대한 800 개 가장 최근의 트윗 ID의 목록을 얻을 수 있습니다, 당신은의 타임 라인에이 명령에 의해 반환 된 ID의 목록을 복사 추종자 (응용 프로그램 코드 또는 LUA 스크립트 사용). 이 타임 라인은 유닉스 타임 스탬프를 점수로 갖는 정렬 된 집합으로 다시 한번 표현됩니다. Redis에서 완벽하게 허용되는 응용 프로그램 코드에서 복사를 수행하는 경우 pipelining을 사용하여 고유 한 네트워크 작업에서 정렬 된 집합에 배수 쓰기를 수행하는 것을 잊지 마십시오. 그것은 공연을 크게 향상시킬 것입니다.

타임 라인 콘텐츠를 가져 오려면 pipelining도 사용하십시오. 특정 날짜 이전에 트윗을 게시하지 않으려면 제한 옵션 및/또는 타임 스탬프를 사용하여 ZREVRANGEBYSCORE를 사용하여 트윗 ID를 요청하십시오.