2011-10-03 2 views
2

중첩 된 주석 (중첩의 유일한 레벨, 예 : 페이스 북)을 찾기 위해 애 쓰고 있습니다.redis에서 1 레벨 중첩 주석을 구조화하는 방법은 무엇입니까?

중첩되지 않은 "의견"을 얻기 위해 정렬 된 세트를 사용했습니다. 점수를 타임 스탬프로 사용하고 멤버를 주석을 렌더링하는 데 필요한 모든 정보가 들어있는 json으로 인코딩 된 속성 집합으로 사용합니다.

zadd 'users:1:comments', 123456789, {body : 'hello'} 

을 그리고 검색하면이만큼 간단하다 :

그래서 코멘트를 추가하면 다음과 같을 수

나는이에 확장을 시도한 중첩 된 주석을 지원하기 위해
zrevrange 'users:1:comments', 0, 20 

어떤 방식 으로든 두 가지 다른 방법에 대해 브레인 스토밍했는데 문제가 있습니다.

1)

,

부모 코멘트

zadd 'users:1:comments', 123456789, {id : 1, body : 'hello'} 
zadd 'comments:1:comments', 123456789, {id : 2, body : 'nested hello', comment_id : 123 } 

에 comment_id 포인트는 다음과 같이겠습니까 속성 목록에 comment_id 추가 : 그것은 매김에 올 때이 방법

-hello 
    -nested hello 

문제입니다. 댓글에 20 개의 중첩 된 댓글이 있고 처음 10 개의 댓글 만 표시하는 경우 중첩 된 트리가 자릅니다 (부모 댓글 + 9 개의 중첩 된 댓글이 검색됩니다)

2)

사용자의 피드 표시 할 때이 N + 1 레디 스 쿼리가 발생할 것입니다, 그러나

This is a parent comment 
zadd 'users:1:comments', 123456789, {id: 1, body : 'hello'} 
this is a nested comment 
zadd 'comments:1:comments' 123456789, {id: 2, body : 'nested hello'} 

:

zrevrange 'users:1:comments', 0, 20 
zrevrange 'comments:1:comments', 0, 20 
zrevrange 'comments:2:comments', 0, 20 
etc... 

을 ... 아니

는 자신의 피드에 중첩 된 주석을 넣어 ~까지 중첩 된 주석은 아마도 범위로 선택되면 안된다는 것을 언급하십시오.

이상 적으로는 단일 redis 쿼리로 작업하는 것이 좋지만 데이터를 구조화하는 방법을 잘 모르겠습니다.

아이디어가 있으십니까?

답변

0

단 하나의 redis 쿼리가 발생할 수있는 유일한 방법은 Lists을 사용하는 것입니다.

상위 항목을 추가 할 때 간단히 LPUSH을 목록 상단 (왼쪽)에 추가 할 수 있습니다. 자식 주석을 추가 할 때는 LINSERT 'user:1:comments' AFTER parent-comment-data child-comment-data과 같은 것을 사용합니다.

이렇게하면 redis가 부모 주석 데이터를 검색하고 그 바로 뒤에 하위 데이터를 배치합니다. 이 작업은 O (N) 작업이며 맨 위 (왼쪽)에서 아래 (오른쪽)까지 수행되므로 부모가 더 오랫동안이 작업을 수행하는 데 더 오랜 시간이 걸리므로 은 매우입니다. 목록 또는 스레드 크기를 4 또는 5 자리 범위로 유지하는 경우에는 문제가 없습니다.

그런 다음 간단한 LRANGE은 부모와 자녀 모두 최신 의견을 가져올 수 있으며 숫자는 제한되어 있습니다.

정렬 된 집합의 점수 값을 사용하여 비슷한 결과를 얻을 수 있으므로 어린이보다 부모보다 낮은 점수를 얻을 수 있습니다. 두 개의 상위 주석 사이에서 사용 가능한 점수가 부족할 수 있으므로 삽입을 복잡하게 만들 수 있습니다. 즉, 많은 (또는 대부분의) 주석에 대해 점수를 재 할당하기위한 작업을 실행해야합니다. 모든 삽입물에 이런 일이 발생하면 삽입물이 (불필요하게) 값 비쌀 수 있습니다.

+0

원래 게시물 # 1에서 설명한 페이지 매김 문제를 해결하지는 않았습니까? – jsharpe

관련 문제