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 lista = novo CouchbaseList(balde, "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 |
// adicionar 10 objetos à lista para(var i = 0; i < 10; i++) lista.Adicionar(novo { num = i, foo = "bar" + Guia.NovoGuia()}); // remover um item da lista por índice lista.RemoveAt(5); // mostrar um item da lista por índice var item = lista[5]; Console.WriteLine("5º item da lista: " + 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 fila = novo CouchbaseQueue(balde, "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 |
para(var i = 0; i < 3; i++) fila.Enfileirar(novo { num = i, foo = "baz" + Guia.NovoGuia()}); // fila de espera var item = fila.Fila de espera(); Console.WriteLine("item num " + item.num + " foi retirado da fila. Agora existem " + fila.Contagem + " itens restantes na fila."); |
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 ditado = novo CouchbaseDictionary<string,dinâmico>(balde, "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 |
para(var i = 0; i < 5; i++) ditado.Adicionar("chave" + Guia.NovoGuia(), novo { num = i, foo = "qux" + Guia.NovoGuia()} ); // imprimir as chaves no dicionário Console.WriteLine("Há " + ditado.Chaves.Contagem + " chaves no dicionário."); antes de(var chave em ditado.Chaves) Console.WriteLine("chave: " + chave + ", value.num: " + ditado[chave].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. [...]