2017-05-16 7 views
1

첫째, 도서관에 대한 링크 : ServiceStack.RedisC#을 ServiceStack.Redis 저장소 개체

는 지금, 나는 T는 필드 KeyValue 함유하는 경우에는 유형 T의 객체를 저장할. (이 예제의 경우)

문제는 키와 값으로 문자열을 저장할 수있는 것처럼 보입니다. 문자열 키까지 완벽하게 괜찮습니다.하지만 객체를 값으로 저장해야합니다. 첨부

은 해시 매핑 지원 내 코드 -> KeyValuePair 항목

public void PutDictionary(string hashKey, Dictionary<string, T> items, TimeSpan expiration) 
{ 
    try 
    { 
     using (var trans = _client.CreateTransaction()) 
     { 
      foreach (KeyValuePair<string, T> item in items) 
      { 
       trans.QueueCommand(r => r.SetEntryInHash(hashKey, item.Key, ???)); 
      } 

      trans.Commit(); 
     } 
    } 
    catch (Exception e) 
    { 
     // some logic here.. 
    } 
} 

임 알고 난 그냥 JSON 내 객체를 캐릭터 라인 화 할 수 있지만이 단지 매우 필요한 성능과 효과를 잃고 소비처럼이 보인다 빠른 캐시 메모리.

내가 달성하고 싶은 것을 설명하십시오. 그룹에 사람들이 있다고 말합니다. 그룹에 ID가 있고이 그룹의 각 엔티티에도 ID가 있습니다. 특정 그룹의 특정 인물을 만나고 싶습니다. 당신은 그냥 문자열로 값 개체를 serialize해야 Dictionary<string, Dictionary<string, T>>

답변

2

을하는 그 equivilant C#에서

. Redis에 객체를 저장하는 개념은 없습니다. ServiceStack.Redis는 Typed Redis Client와 함께 Typed API를 제공합니다.이 객체는 장면 뒤에서 JSON으로 직렬화하고 JSON 문자열을 Redis에 전송합니다.

ServiceStack.Redis는 개체 속성이 Redis 해시에 저장되는 StoreAsHash(T)SetRangeInHash과 같은 API도 제공하지만이 경우 값이 다른 Redis 해시가 될 수 없도록 중첩 된 해시를 저장합니다.

당신은 사전 키 hashKey을 결합하여 사용자 정의 키에 객체를 저장하여 다른 "중첩 된 사전", 예컨대 허용 할 수

:

foreach (var entry in items) { 
    var cacheKey = hashKey + ":" + entry.Key; 
    var mapValues = entry.Value.ToJson() 
     .FromJson<Dictionary<string,string>>(); 
    redis.SetRangeInHash(cacheKey, mapValues); 
} 
+0

당신이 당신의 두번째 행이 무엇을 설명 할 수 있습니까? 값을 가져 와서 문자열로 변환하고 무엇을합니까? 작성한 내용이 키를 추가하거나 전체 해시를 재정의하는 것입니까? –

+0

@OriRefael 그것은 문자열로 변환합니다. – mythz

+0

예, 전 완전히 검게 변했습니다 ... 감사합니다. 보너스를 원한다면 동일한 요청에서 세트 만료를 설정하는 방법이 있습니까? 나는 아직 시도하지 않았지만 여기에서 트랜잭션을 사용해야 함을 확신한다. –