2011-09-14 3 views
4
parent = { 
    child0: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child1: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child2: { 
     data1:'foo', 
     data2: 'bar' 
    } 
} 

처음에는 형제 중 해당 데이터가 개별적으로 필요하므로 parent:child 키를 설정한다고 생각했습니다. 그러나 일부 경우에는 부모 내의 모든 데이터를 반환해야합니다.이 개체를 Redis에 어떻게 저장해야합니까?

전체 개체를 parent 키에 넣어야합니까?

많은 가져 오기 및 세트가 자녀 중 한 명일 경우에만 단점이 있습니까?

스키마가 parent:child 인 모든 상위 데이터를 호출하는 방법이 있습니까?

감사합니다.

답변

2

해시를 시도해보십시오. 하나의 자식 만 얻고 HGETALL을 사용하면 모든 것을 얻을 수 있습니다.

전체 개체를 단일 키로 JSON으로 저장하는 것도 유효하지만 사용법이 적합한 경우 코드를 간단하게 유지합니다. 숫자가 너무 크지 않은 경우 하나의 하위 객체 만 표시해야하는 경우에도 항상 전체 객체를 검색하는 것이 좋습니다.

하나의 키에 복잡한 개체를 저장하는 것을 피하는 주된 이유는 쓰기 충돌입니다. 두 연결이 한 개체의 다른 자식을 동시에 수정할 수 있으면 해시는 훨씬 덜 문제가됩니다.

+0

아, 예, 모든 하위 개체는 동시에 편집됩니다. 나는 이것을 가능한 한 많이 단일 키에서 피해야 만합니까? – fancy

+0

예 - redis는 충분히 빠르므로 충돌이 발생하지는 않지만 가장 편리한 지점에서 발생하여 버그를 찾기 어렵습니다. 해시 또는 다중 키를 사용하면 각 항목이 독립적이므로 충돌이 불가능합니다. –

+0

아아아, 두 명의 다른 어린이가 동시에 변경 될 때 충돌을 완화 할 해시 기능을 사용한다면 어떻게 될까요? – fancy

0

해시 데이터 형식을 이용하는 것이 좋습니다. 부모를 해시 키로 사용하고 특정 자식에 대해 (HGET 키 필드)를 사용하거나 모든 자식에 대해 (HKEYS 키)를 사용합니다.

누군가 해시 명령 HSET 및 HGET에 대한 벤치 마크를 게시하는 것이 흥미로울 것입니다. 목록 작업 (LPUSH 88109.25/초)에 대한 벤치 마크는 (~ 114 %) 느립니다 (SET 114293.71/초). 아마도 HSET은 아직 O (1)로 기록되어 있지만 더 느립니다.

그래서 코드에서 개별 요청에 대한 전체 가족 요청 비율을 살펴보면 의사 결정 속도가 빨라질 것이라고 생각합니다.

+0

조언 주셔서 감사합니다. 자식 프로세스가 본질적으로 동시에 설정되는 경우 어떻게 될까요? HGET/HSET이 이러한 불일치를 관리 할 수 ​​있습니까? – fancy

+0

내가 처음 거래에 대해 이야기한다고 생각했지만 HMSET 명령은 여러 해시 값 (하위)을 동시에 설정할 때 찾고있는 것으로 생각합니다. –

관련 문제