A adição do API de subdocumento para o Couchbase 4.5 abriu o caminho para o suporte eficiente à estrutura de dados em Couchbase.
Nesta postagem do blog, vou mostrar uma demonstração de três tipos de estruturas de dados que você pode usar com o Couchbase .NET SDK:
- Lista - uma lista de objetos, basicamente uma lista apoiada pelo Couchbase
- Queue - uma fila de objetos, basicamente uma fila apoiada pelo Couchbase
- Dicionário - um dicionário de objetos, basicamente um Dictionary apoiado pelo Couchbase
Também discutirei um pouco sobre como isso funciona nos bastidores.
Se quiser, você pode jogar em casa. O código-fonte deste blog é disponível no GitHube O download do Couchbase Server é gratuito (as visualizações da versão 5 para desenvolvedores estão disponíveis mensalmente).
Lista
Uma lista é uma estrutura de dados .NET que é mantida na memória. Com as estruturas de dados fornecidas pelo SDK do Couchbase .NET, você pode armazená-la em um documento do Couchbase.
Para criar uma lista com base no Couchbase:
|
1 |
var list = new CouchbaseList(bucket, "myList"); |
A string "myList" corresponde à chave do documento que conterá a lista. Ao usar CouchbaseListum único documento com essa chave será criado (se ainda não existir um). Se já existir um documento com essa chave, CouchbaseList o utilizará.
Agora você pode adicionar/remover itens da lista e tudo isso será mantido no documento. Você também pode executar outras operações, como obter uma contagem dos itens na lista.
|
1 2 3 4 5 6 7 8 9 10 |
// add 10 objects to the list for(var i = 0; i < 10; i++) list.Add(new { num = i, foo = "bar" + Guid.NewGuid()}); // remove an item from the list by index list.RemoveAt(5); // show an item from the list by index var item = list[5]; Console.WriteLine("5th item in the list: " + item.foo + " / " + item.num); |
O código acima resultaria em um documento com uma chave "myList" que se parece com o seguinte. Observe que o item com número 5 não está listado, pois foi removido.
Há algo sutil no exemplo acima que precisa ser destacado. Observe que eu usei var item = list[5]; e depois item.foo e item.num no WriteLine. Se eu usasse lista[5].foo e lista[5].num diretamente, o que resultaria em duas chamadas de subdocumentos diferentes para o Couchbase. Além de essa eficiência não ser a ideal, é possível que os valores mudem entre as duas chamadas.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[ { "num": 0, "foo": "bara1fd74ee-a790-4a0f-843c-abe449cb8b1d" }, { "num": 1, "foo": "bardc1d8f9a-4e93-46f9-b8ae-ec036743869e" }, { "num": 2, "foo": "bar9a60abe9-1e04-4fba-bd1f-f1ec39d69f56" }, { "num": 3, "foo": "bar9566605b-7abf-4a0c-aa9d-63b98ce86274" }, { "num": 4, "foo": "bar6261323f-de50-42a7-a8a7-6fcafb356deb" }, { "num": 6, "foo": "bar13832bcb-2aa0-491a-a01f-1d496f999ffc" }, // ... etc ... ] |
Fila
Muito semelhante à Lista, você pode criar uma fila apoiada no Couchbase:
|
1 |
var queue = new CouchbaseQueue(bucket, "myQueue"); |
Uma fila é armazenada da mesma forma que uma lista. A diferença é que a ordenação é significativa, e isso se reflete nas operações que você executa em uma fila: Enqueue e Dequeue.
|
1 2 3 4 5 6 |
for(var i = 0; i < 3; i++) queue.Enqueue(new { num = i, foo = "baz" + Guid.NewGuid()}); // dequeue var item = queue.Dequeue(); Console.WriteLine("item num " + item.num + " was dequeued. There are now " + queue.Count + " items left in the queue."); |
O código acima resultaria em um documento com uma chave "myQueue" (veja o JSON abaixo). Observe que não há nenhum objeto na matriz com o número "0" porque ele foi retirado da fila.
|
1 2 3 4 5 6 7 8 9 10 |
[ { "num": 1, "foo": "baz64bb62b6-bf23-4e52-b584-d2fa02accce6" }, { "num": 2, "foo": "baz0a160bd9-aa7b-4c45-9e19-d1a3d982a554" } ] |
Dicionário
Espero que esteja vendo um padrão agora. Para criar um dicionário:
|
1 |
var dict = new CouchbaseDictionary<string,dynamic>(bucket, "myDict"); |
Novamente, um documento será criado com a chave fornecida. As operações que podem ser realizadas incluem Adicionar, Remover e o indexador [] operação.
|
1 2 3 4 5 6 7 |
for(var i = 0; i < 5; i++) dict.Add("key" + Guid.NewGuid(), new { num = i, foo = "qux" + Guid.NewGuid()} ); // print out keys in the dictionary Console.WriteLine("There are " + dict.Keys.Count + " keys in the dictionary."); foreach(var key in dict.Keys) Console.WriteLine("key: " + key + ", value.num: " + dict[key].num); |
Um documento de dicionário tem a seguinte aparência:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "key5aa2520d-123c-4fca-b444-b0cb8846d46e": { "num": 0, "foo": "qux93b197dc-f175-4246-a38d-7b080eb9bea0" }, "key55dee298-14c6-4da7-97a8-66c69d7e8a70": { "num": 1, "foo": "quxa593ee4c-682c-402d-887b-3f09f029e9b6" }, "key3386afcf-7b70-4e4d-b9ae-6defbca33fe7": { "num": 2, "foo": "qux1259ae94-1008-4e1f-86a1-bfbd0873b09b" }, "key2bc8c451-f125-4282-9fb4-7ea15f4b3168": { "num": 3, "foo": "qux1b6fb62b-9918-46dc-9a2f-610a55d017ef" }, "key3f7041f3-abd3-49c7-a373-454cbd2ac0fc": { "num": 4, "foo": "qux0a87655f-197d-4fb2-8a54-b1de6e288de4" } } |
Uma observação sobre a dinâmica C#: usei dinâmico para manter os exemplos de código curtos e simples. Em seu aplicativo, provavelmente será melhor usar um tipo C# definido de verdade. Tudo isso é serializado para JSON no Couchbase, é claro.
Nos bastidores
Antes de a API de subdocumentos ser lançada no Couchbase Server 4.5, essas estruturas de dados eram possívelé claro. O problema é que você carregaria o documento inteiro, o colocaria em uma lista, faria alterações na lista e depois salvaria o documento inteiro. Se você tiver estruturas de dados grandes, mas estiver apenas lendo ou fazendo alterações em um único item, isso geralmente resultaria em perda de tempo e de largura de banda e, possivelmente, em maior contenção.
A API de subdocumentos (que você pode usar diretamente; eu a abordei na seção API de subdocumento no Couchbase Server 4.5 com o SDK do .NET (revisitado) ) é usado nos bastidores do CouchbaseList, CouchbaseQueuee CouchbaseDictionary. Portanto, quando você adiciona um item a um CouchbaseListPor exemplo, apenas esse item está sendo enviado pelo cabo, não a lista inteira.
Algumas operações ainda precisarão obter o documento inteiro. Por exemplo, iterar em uma coleção usando um antes de recuperará o documento completo. A remoção de um item de uma lista resultará na digitalização do documento completo. Porém, se as operações de subdocumento surgirem no futuro para dar suporte a essas ações, as implementações do SDK serão atualizadas de acordo.
Resumo
Essas estruturas de dados são outra ferramenta para ajudá-lo a gerenciar seus dados. Como elas usam a API de subdocumento, geralmente têm mais desempenho do que uma abordagem de documento inteiro. Para obter mais detalhes, consulte a seção Documentação sobre estruturas de dados.
Tem dúvidas? Comentários? Precisa de ajuda? Visite nossos fórunsEntre em contato comigo Twitter @mgrovesou deixe um comentário.
[...] muitos outros belos exemplos de estruturas de dados do Couchbase .NET no blog de Matthew Grove [...]
[...] Em fevereiro, escrevi um blog sobre o uso de estruturas de dados com o .NET (e o .NET Core): Lista, Fila e Dicionário. [...]