2012-03-19 3 views
1

해결 : 목록에 단일 SerialKey를 추가하려고했습니다. 현재 하나의 키가있는 SerialKeyList를 추가하면 그것이 정상적으로 작동합니다.memcache가 Google 프로토콜 버퍼를 추가/앞에 추가

저는 memmached와 libmemcached를 사용하고 있습니다. Google 프로토콜 버퍼는 요소 목록과 블랙리스트 요소 목록으로 구성된 캐시에 목록을 저장합니다.

.proto은 :

message SerialKeyList { 
repeated SerialBlackKey bkey = 2; 
repeated SerialKey key = 1; 
} 

message SerialKey { 
optional string key = 1; 
} 

message SerialBlackKey { 
optional string key = 2; 
} 
I가 memcached_append으로 어느 타입의 직렬 키 SerialBlackKey 또는 단일 요소를 추가하고자

(). 하나의 SerialKey 요소 (memcached_set (SerialKeyList) 사용)로 목록을 초기화 한 다음 하나의 SerialBlackKey 요소 (memcached_append 포함)를 추가합니다.

PrintDebugString와 memcached를 인쇄에서 목록을 (구문 분석 할 때 내가 무엇입니까 결과) 그래서 두 목록이 생성

key { 
    key: "REPL:http://a.host.com/replica" 
} 
bkey { 
    10: "PL:http://a.host.com/replica" 
} 

이지만, 두번째 요소를 제대로 읽지 못하고있다.

가능해야합니까? Protobuf 인코딩 documentation에서 나는 반복 된 필드가 다른 필드를 따라야 할 필요가 없다는 것을 이해하므로 다른 유형의 필드를 인터리빙 할 수 있어야합니다.

/EDIT : 목록에있는 한 유형의 요소 (SerialKey)에만 동일한 문제가 있습니다. 여기에서 SerialKey에 대한 추가 속성을 사용하여 블랙리스트에 있는지 여부를 결정합니다. 프로토 :

message SerialKeyList { 
    repeated SerialKey key = 1; 
} 

message SerialKey { 
    required string key = 1; 
    required bool white = 2 [default = true]; 
} 

답변

0

당신은 맞다 - 구현 특별히이 APPEND 시나리오를 지원하기 위해, 임의의 순서로 필드를 허용해야 테 사양 상태.

추가 할 키는 하나의 SerialKey 또는 SerialBlackKey와 함께 SerialKeyList를 추가하더라도 여전히 SerialKeyList처럼 보일 것입니다.

참고 사항 : 문자열 버전을 사용하는 경우 append가 작동하는지 잘 모릅니다. 그러나 바이너리 버전은 확실히 추가 가능합니다.

좀 더 구체적인 답변을 얻으려면 아마도 이것을 어떻게 구성하는지 표시하고 사용중인 구현을 기술해야합니다.

+0

당신은 내 문장을 측면 문장으로 해결했습니다. 목록에 단일 SerialKey를 추가하려고했습니다. 이제 하나의 키가있는 SerialKeyList를 추가하면 정상적으로 작동합니다. – devjat

+0

@ user1279035 나는 그것이 될 직감이 있었다 : p –

관련 문제