Memcache добавить / добавить с буферами протокола Google - PullRequest
1 голос
/ 19 марта 2012

решено: я попытался добавить один SerialKey в список. Когда я теперь добавляю SerialKeyList одним ключом, он работает так, как и должно быть.

Я использую memcached с 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;
}

Я хотел бы добавить отдельные элементы типа SerialKey или SerialBlackKey с помощью memcached_append (). Я инициализирую список одним элементом SerialKey (с memcached_set (SerialKeyList)), а затем добавляю один элемент SerialBlackKey (с memcached_append).

Результат, который я получаю при разборе списка из memcached и печати с помощью PrintDebugString (), равен

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

Итак, два списка созданы, но 2-й элемент прочитан неправильно.

Должно ли это быть возможным? Из кодировки Protobuf документация я понимаю, что повторяющиеся поля не должны следовать за другим, поэтому чередование полей другого типа должно быть возможным.

/ EDIT: у меня та же проблема только с одним типом элемента (SerialKey) в списке. Здесь я использую дополнительный атрибут SerialKey, чтобы решить, находится ли он в черном списке. Прото:

message SerialKeyList {
  repeated SerialKey key = 1;
}

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

1 Ответ

0 голосов
/ 19 марта 2012

Вы правы - спецификация утверждает, что реализации должны разрешать поля в любом порядке, особенно для поддержки этого сценария добавления.

Ключом к добавлению является то, что он все равно должен выглядеть как SerialKeyList, даже если вы добавляете SerialKeyList только с одним SerialKey или SerialBlackKey.

Примечание также: я понятия не имею, работает ли append, если вы используете строковую версию - хотя бинарная версия, безусловно, добавима.

Для более конкретного ответа вам, вероятно, нужно показать, как вы его создаете, и указать, какую реализацию вы используете.

...