복붙노트

[REDIS] ServiceStack.Net 레디 스 : 보관 관련 관련 개체 ID 대 개체

REDIS

ServiceStack.Net 레디 스 : 보관 관련 관련 개체 ID 대 개체

우리 팀은 우리가 작업중인 새로운 대량 웹 사이트에 대한 기본 저장소로 ServiceStack.net 레디 스 클라이언트를 통해 레디 스 함께 작동하도록 결정했다. ServiceStack.Net 포함하는을 통해 실제로 레디 스를 구현하는 방법에 대한 문서에 대한 최종 소스가 - 정말 확실 (일반 레디 스의 문서 또는 특정 ServiceStack.Net 워드 프로세서 또는 모두에 대해 하나)이 질문에 대한 문서를 찾기 위해하는 곳이 아니에요 모든 당신은 레디 스 개념과 ServiceStack.Net 개념 모두에 대해 알아야 할, 또는 우리가 전체 그림을 얻기 위해 별도로 두 측면에서 문서를 통합해야합니까?

난 그냥 우리 모델의 객체 그래프에서 관련 개체를 저장하는 방법을 정확하게 고심하고있다. 여기에 내가 작업 할 것을 간단한 시나리오는 다음과 같습니다

사용자 및 피드 : 시스템의 두 개체가 있습니다. RDBMS의 측면에서이 두 객체는 ​​일대 다 관계, 즉, 사용자가 피드 개체의 컬렉션 및 공급 수 단에 속하는 하나의 사용자를 가지고있다. 피드는 항상 사용자를 통해 레디 스에서 액세스 할하지만 때때로 우리는 공급 인스턴스를 통해 사용자에 접근 할 수 있습니다.

내가 가지고있는 문제는 우리가 속성으로 관련 개체를 저장해야 또는 우리는 관련 개체의 id 값을 저장할지 여부입니다 그래서? 설명하기 :

접근 :

public class User
{
    public User()
    {
        Feeds = new List<Feed>();
    }

    public int Id { get; set; }

    public List<Feed> Feeds { get; set; }

    // Other properties
}

public class Feed
{
    public long Id { get; set; }

    public User User { get; set; }
}

B 접근 :

public class User
{
    public User()
    {
        FeedIds = new List<long>();
    }

    public long Id { get; set; }

    public List<long> FeedIds { get; set; } 

    public List<Feed> GetFeeds()
    {
        return repository.GetFeeds( FeedIds );
    }
}

public class Feed
{
    public long Id { get; set; }

    public long UserId { get; set; }

    public User GetUser()
    {
        return repository.GetUser( UserId );
    }
}

위의 방법 중 가장 적합한? 나는 모두가 다양한 예에서 사용 된 접근법 본 적이 있지만 내가 본 예제 중 일부는 모범 사례하지 않을 수 있다는 인상을받을.

몇 가지 간단한 관련 질문 :

죄송합니다 이런 질문이 좀 기본적인 경우 - 혼자 ServiceStack하자 - - 심지어 레디 스의 들어 본 적이없는 것 3 주 전까지 우리가 정말 여기 처음부터 시작하고, 그래서 (도 우리 팀에 사람이 있었다) ...

해결법

  1. ==============================

    1.오히려 다시 해시보다 야생에서 거기의 다른 많은 문서, 나는 레디 스 + ServiceStack의 레디 스 클라이언트의 주위에 몇 가지 배경 정보에 대한 몇 주위를 나열합니다 :

    오히려 다시 해시보다 야생에서 거기의 다른 많은 문서, 나는 레디 스 + ServiceStack의 레디 스 클라이언트의 주위에 몇 가지 배경 정보에 대한 몇 주위를 나열합니다 :

    우선은 데이터 저장소로 레디 스를 사용하여 단지 빈 캔버스를 제공하고, 자체적으로 관련 기관의 개념이없는 것을 지적하고 싶다. 즉 그것은 단지 분산 COMP-공상 과학 데이터 구조에 대한 액세스를 제공합니다. 어떻게 관계를 저장 얻을 것은 레디 스의 기본 데이터 구조 작업을 사용하여, 궁극적으로 최대 클라이언트 드라이버 (즉 ServiceStack C # 레디 스 클라이언트) 또는 응용 프로그램 개발자에게 있습니다. 모든 주요 데이터 구조 레디 스에서 구현되기 때문에, 당신은 기본적으로 당신이 구조에하려는 방법에 완전한 자유를 가지고 데이터를 저장합니다.

    가장 좋은 방법은 레디 스에 보관 물건에, 데이터는 RDBMS 테이블에 저장하고이 메모리에 C 내장 # 컬렉션 클래스를 사용하여 즉, 코드에 저장되어있는 방법에 대해 생각하는 방법에 대해 완전히 무시하는 것입니다 방법에 대해 생각하는 그래서 - 이는 자신의 서버 측 데이터 구조와 행동 레디 스 거울.

    관련 기관의 개념을 가지고 있지에도 불구하고, 레디 스의 내장 설정 및 SortedSet의 데이터 구조 인덱스를 저장하는 이상적인 방법을 제공합니다. 예를 들면 레디 스 세트의 콜렉션은 소자 1 명 발생 최대 저장한다. 항목이 동일하면 1 또는 100 번을 호출 한 것입니다 최종 결과로 이미 존재하는 경우 안전하게에 항목 / 키 / ID를 추가 할 수없는이 방법은 신경 - 즉 그것의 나무 등, 궁극적으로 단 1 요소에 저장된 상태로 유지 세트. 객체 그래프 (집계 루트)를 저장할 때 일반적인 사용 사례는 그래서 모델 저장할 때마다 당신을 세트로 (외래 키 일명) 아동 엔티티 ID를 저장하는 것입니다.

    그것은 함께 당신의 입력 개체를 그룹화, 멋진 계층 뷰를 제공하기 위해 아래의 키 이름 지정 규칙을 사용하기 때문에 레디 스 I에 저장하는 방법을 엔티티의 좋은 시각화를위한 ServiceStack의 C # 레디 스 클라이언트와 잘 작동 레디 스 관리 UI 설치를 권장 (모든 키에도 불구하고 ) 같은 글로벌 키 스페이스에 존재하는.

    보기 및 편집 엔티티를 참조하고 선택한 개체의 내부 JSON 표현을 수정하려면 편집 링크를 클릭합니다. 희망 당신은 그들이 저장됩니다 방법을 볼 수 있습니다 일단 모델을 설계하는 방법에 대한 더 나은 결정을 내릴 수 있습니다.

    는 C # 레디 스 클라이언트가 하나의 기본 키를 가지고있는 포항 강판와 함께 작동 - 기본적으로 이드가 될 것으로 예상된다 (ModelConfig와 재정의이 협약하지만). 기본적으로 포항 강판은 대해서 typeof 모두 직렬화 된 JSON로 레디 스에 저장됩니다 (마시고) .NAME와 ID가 해당 인스턴스에 대한 고유 키를 형성하는 데 사용됩니다. 예컨대 :

    urn:Poco:{Id} => '{"Id":1,"Foo":"Bar"}'
    

    는 C # 클라이언트에서 포항 강판은 통상적으로 (직렬화 해제를 다시 얻기 위해 공공 세터) ServiceStack의 공개 게터 만 속성 직렬화 빠른 JSON 시리얼을 사용하여 직렬화된다.

    기본값은 [DataMember를] attrs에로 덮어 쓸 수 있지만, 그것은 당신의 포항 강판을 uglifies 때문에 권장하지 않습니다.

    그래서 레디 스에서 포항 강판 단지 blobbed하는 것을 알고, 당신은 단지 (당신이 의도적으로 중복 데이터를 저장하지 않으려면) 공용 속성 같은 포항 강판에 비 집계 루트 데이터를 유지하려는. 좋은 규칙은 (는 직렬화 얻을 실 거예요 때문에) 관련 데이터를 가져올뿐만 아니라 방법은 데이터를 읽을 수있는 원격 호출을 앱에 지시하는 방법을 사용하는 것입니다.

    피드는 사용자와 함께 저장받을 것인지 여부에 대한 질문은 당신이 사용자의 컨텍스트 외부 사용자의 피드에 액세스하려면 즉 여부, 비 집계 루트 데이터인지 아닌지 그래서? 어떤 경우, 사용자 유형의 목록 <피드> 피드 속성을 떠나지 않습니다.

    당신이 redisFeeds.GetById (1)와 독립적으로 접근 즉 모든 피드를 유지하고자하지만 경우에 당신은 2 개체를 연결하는 인덱스를 외부 사용자의 보관 및 유지 관리하는 것이 좋습니다.

    당신이 엔티티와 어떻게 당신이 사이의 관계를 저장하는 방법에는 여러 가지가 나타났습니다 그래서 대부분 취향의 문제이다. 부모에서 자식 개체의 경우> 자식 관계는 항상 아이 엔티티와 ParentId를 저장할 것입니다. 학부모 위해 당신은 하나 하나가 다시 수화물 모델에 모든 자식 개체에 대한 인출 할 다음 모델 ChildIds의 컬렉션을 저장하도록 선택할 수 있습니다.

    또 다른 방법은 각 부모 인스턴스에 대한 자신의 설정에 부모 DTO의 인덱스 외부를 유지하는 것입니다. 이것의 좋은 예는 사용자> 질문 및 사용자> 답변의 관계에 저장되어있는 레디 스 StackOverflow의 데모의 C # 소스 코드입니다 :

    idx:user>q:{UserId} => [{QuestionId1},{QuestionId2},etc]
    idx:user>a:{UserId} => [{AnswerId1},{AnswerId2},etc]
    

    는 C # RedisClient 인덱스 장면 뒤에 유지되는 기본 부모에 대한 지원 / 어린이 규칙의 TParent.StoreRelatedEntities를 통해 (), TParent.GetRelatedEntities ()와 TParent.DeleteRelatedEntities을 () API를 포함하지 않지만 그 외모와 같은 :

    ref:Question/Answer:{QuestionId} => [{answerIds},..]
    

    효과적으로이 같은 목적을 달성하고있는 당신은 또한 자신의 롤 수있는 자유를 가지고하는 방법에는 여러 가지가 당신의 가능한 옵션, 단지 일부입니다.

    NoSQL의 스키마가없는, 느슨한 타이핑 자유를 포용해야하며, 당신은 당신이 RDBMS를 사용하는 경우에 익숙 할 수있는 단단하고 사전 정의 된 구조를 따라하려고 걱정되어서는 안된다.

    결론적으로, 레디 스, 예를 들어,에 데이터를 저장 진짜 올바른 방법은 없습니다 는 C # 레디 스 클라이언트는 포항 강판 주위에 높은 수준의 API를 제공하기 위해 몇 가지 가정을하고는 레디 스의 바이너리 안전 문자열 값에 포항 강판을 모양 - 있기는하지만 다른 클라이언트가 대신 엔티티에게 레디 스 해시의 특성 (사전)를 저장하는 것을 선호합니다 . 둘 다 작동합니다.

  2. from https://stackoverflow.com/questions/8914349/servicestack-net-redis-storing-related-objects-vs-related-object-ids by cc-by-sa and MIT license