{"id":1678,"date":"2014-12-16T19:38:48","date_gmt":"2014-12-16T19:38:47","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1678"},"modified":"2017-05-03T10:04:44","modified_gmt":"2017-05-03T17:04:44","slug":"maintaining-set-memcached","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/maintaining-set-memcached\/","title":{"rendered":"Manuten\u00e7\u00e3o de um conjunto no Memcached"},"content":{"rendered":"<div id=\"post\">\n<p><span style=\"color: #c0c0c0;\"><em>[Esta postagem tamb\u00e9m aparece em <\/em><\/span><em><a href=\"https:\/\/dustin.github.com\/2011\/02\/17\/memcached-set.html\"><span style=\"color: #c0c0c0;\">Blog do Dustin no github<\/span><\/a><\/em><span style=\"color: #c0c0c0;\"><em>].<\/em><\/span><\/p>\n<p>Isso \u00e9 algo que surge de vez em quando <img decoding=\"async\" class=\"floatright\" title=\"Encontrei isso em alguns arquivos militares antigos.\" src=\"https:\/\/dustin.github.com\/images\/simple.png\" alt=\"simple\" align=\"right\" hspace=\"15\" \/><br \/>\nenquanto isso. Normalmente, descrevo um meio de fazer isso que acho que faz sentido, mas acho que nunca o descrevi <em>bastante<\/em> bem o suficiente. As pessoas tendem a achar que \u00e9 complicado, lento ou coisas do g\u00eanero. Vou tentar resolver esse problema aqui.<\/p>\n<h3>Restri\u00e7\u00f5es<\/h3>\n<p>Para que seja \u00fatil para aplicativos suficientes, trabalharemos com as seguintes premissas:<\/p>\n<ul>\n<li>deve minimizar as viagens de ida e volta para os servidores<\/li>\n<li>O(1) add (tanto para o tamanho atual quanto para os novos itens que est\u00e3o chegando)<\/li>\n<li>O(1) remove (tanto para o tamanho atual quanto para os itens que est\u00e3o sendo removidos)<\/li>\n<li>O(1) busca<\/li>\n<li>lock and wait free<\/li>\n<li>F\u00e1cil de usar<\/li>\n<li>f\u00e1cil de entender<\/li>\n<li>sem necessidade de manuten\u00e7\u00e3o expl\u00edcita<\/li>\n<\/ul>\n<p>E, \u00e9 claro, tem que ser em escala web!<\/p>\n<h3>Ingredientes<\/h3>\n<p>O conceito \u00e9 simples e faz uso de tr\u00eas opera\u00e7\u00f5es do memcached com garantias de atomicidade.<\/p>\n<p>Um \u00edndice \u00e9 criado com <code>adicionar<\/code>. Isso deve ser bastante \u00f3bvio.<\/p>\n<p>Sempre que precisarmos adicionar ou remover itens, usaremos <code>anexar<\/code>. Para que isso funcione, precisamos codificar os itens de forma que eles representem itens positivos ou negativos. Criei um exemplo simples de codifica\u00e7\u00e3o de <code>+chave<\/code> para representar a adi\u00e7\u00e3o de <code>chave<\/code> para o conjunto e <code>-chave<\/code> para representar a remo\u00e7\u00e3o de <code>chave<\/code> do conjunto. Em seguida, uso espa\u00e7os para separar v\u00e1rios itens.<\/p>\n<p>Exemplo: <code>+a +b +c -b<\/code> representa <code>{a, c}<\/code>. A sequ\u00eancia \u00e9, obviamente, importante.<\/p>\n<p>Um conjunto com membros que entram e saem com frequ\u00eancia suficiente pode precisar ser compactado. Para isso, recodificamos o conjunto e usamos <code>cas<\/code> para garantir que possamos adicion\u00e1-lo de volta sem pisar em outro cliente.<\/p>\n<h3>Me acompanhe at\u00e9 o fim<\/h3>\n<p>Estou usando python para este exemplo. O ideal \u00e9 que isso seja implementado em seu cliente e tudo esteja pronto para funcionar.<\/p>\n<p>Primeiro, precisamos de codificadores e decodificadores. Essa \u00e9, na verdade, a parte mais dif\u00edcil e \u00e9 realmente trivial quando se trata disso.<\/p>\n<h3>O codificador<\/h3>\n<p>Come\u00e7amos com a representa\u00e7\u00e3o mais b\u00e1sica dos dados em nossos conjuntos.<\/p>\n<div class=\"geshifilter\">\n<div class=\"python geshifilter-python\" style=\"font-family: monospace;\">\n<p><span style=\"color: #ff7700; font-weight: bold;\">def<\/span> encodeSet<span style=\"color: black;\">(<\/span>chaves<span style=\"color: #66cc66;\">,<\/span> op<span style=\"color: #66cc66;\">=<\/span><span style=\"color: #483d8b;\">&#8216;+&#8217;<\/span><span style=\"color: black;\">)<\/span>:<br \/>\n<span style=\"color: #483d8b;\">\"\"\"Codifique um conjunto de chaves para modificar o conjunto.<\/span><\/p>\n<p>&gt;&gt;&gt; encodeSet(['a', 'b', 'c'])<br \/>\n'+a +b +c '<br \/>\n&#8220;&#8221;&#8221;<br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">retorno<\/span> <span style=\"color: #483d8b;\">&#8221;<\/span>.<span style=\"color: black;\">unir-se<\/span><span style=\"color: black;\">(<\/span>op + k + <span style=\"color: #483d8b;\">&#8216; &#8216;<\/span> <span style=\"color: #ff7700; font-weight: bold;\">para<\/span> k <span style=\"color: #ff7700; font-weight: bold;\">em<\/span> chaves<span style=\"color: black;\">)<\/span><\/p>\n<\/div>\n<\/div>\n<p>Isso \u00e9 mais documenta\u00e7\u00e3o do que c\u00f3digo, mas \u00e9 bastante claro. Se, em vez disso, voc\u00ea quiser um conjunto de JPEGs, poder\u00e1 criar uma codifica\u00e7\u00e3o bin\u00e1ria simples com um comprimento e um corpo em vez de separ\u00e1-los por espa\u00e7os em branco.<\/p>\n<h3>Modifica\u00e7\u00e3o de um conjunto<\/h3>\n<p>A modifica\u00e7\u00e3o \u00e9 somente de acr\u00e9scimo, sendo que a \u00fanica diferen\u00e7a entre adicionar e remover \u00e9 uma opera\u00e7\u00e3o de codifica\u00e7\u00e3o. Isso \u00e9 \u00fatil porque podemos escrever o mesmo c\u00f3digo para ambos os casos.<\/p>\n<div class=\"geshifilter\">\n<div class=\"python geshifilter-python\" style=\"font-family: monospace;\">\n<p><span style=\"color: #ff7700; font-weight: bold;\">def<\/span> modificar<span style=\"color: black;\">(<\/span>mc<span style=\"color: #66cc66;\">,<\/span> indexName<span style=\"color: #66cc66;\">,<\/span> op<span style=\"color: #66cc66;\">,<\/span> chaves<span style=\"color: black;\">)<\/span>:<br \/>\ncodificado <span style=\"color: #66cc66;\">=<\/span> encodeSet<span style=\"color: black;\">(<\/span>chaves<span style=\"color: #66cc66;\">,<\/span> op<span style=\"color: black;\">)<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">tentar<\/span>:<br \/>\nmc.<span style=\"color: black;\">anexar<\/span><span style=\"color: black;\">(<\/span>indexName<span style=\"color: #66cc66;\">,<\/span> codificado<span style=\"color: black;\">)<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">exceto<\/span> <span style=\"color: #008000;\">KeyError<\/span>:<br \/>\n<span style=\"color: #808080; font-style: italic;\"># Se n\u00e3o pudermos acrescentar, e estivermos adicionando ao conjunto,<\/span><br \/>\n<span style=\"color: #808080; font-style: italic;\"># estamos tentando criar o \u00edndice, portanto, fa\u00e7a isso.<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">se<\/span> op <span style=\"color: #66cc66;\">==<\/span> <span style=\"color: #483d8b;\">&#8216;+&#8217;<\/span>:<br \/>\nmc.<span style=\"color: black;\">adicionar<\/span><span style=\"color: black;\">(<\/span>indexName<span style=\"color: #66cc66;\">,<\/span> codificado<span style=\"color: black;\">)<\/span><\/p>\n<p><span style=\"color: #ff7700; font-weight: bold;\">def<\/span> adicionar<span style=\"color: black;\">(<\/span>mc<span style=\"color: #66cc66;\">,<\/span> indexName<span style=\"color: #66cc66;\">,<\/span> *chaves<span style=\"color: black;\">)<\/span>:<br \/>\n<span style=\"color: #483d8b;\">\"\"\"Adicione as chaves fornecidas ao conjunto fornecido.\"\"\"<\/span><br \/>\nmodificar<span style=\"color: black;\">(<\/span>mc<span style=\"color: #66cc66;\">,<\/span> indexName<span style=\"color: #66cc66;\">,<\/span> <span style=\"color: #483d8b;\">&#8216;+&#8217;<\/span><span style=\"color: #66cc66;\">,<\/span> chaves<span style=\"color: black;\">)<\/span><\/p>\n<p><span style=\"color: #ff7700; font-weight: bold;\">def<\/span> remover<span style=\"color: black;\">(<\/span>mc<span style=\"color: #66cc66;\">,<\/span> indexName<span style=\"color: #66cc66;\">,<\/span> *chaves<span style=\"color: black;\">)<\/span>:<br \/>\n<span style=\"color: #483d8b;\">\"\"\"Remove as chaves fornecidas do conjunto fornecido.\"\"\"<\/span><br \/>\nmodificar<span style=\"color: black;\">(<\/span>mc<span style=\"color: #66cc66;\">,<\/span> indexName<span style=\"color: #66cc66;\">,<\/span> <span style=\"color: #483d8b;\">&#8216;-&#8216;<\/span><span style=\"color: #66cc66;\">,<\/span> chaves<span style=\"color: black;\">)<\/span><\/p>\n<\/div>\n<\/div>\n<p>Eu permito um efeito colateral de <code>adicionar<\/code> para criar o \u00edndice, caso ele n\u00e3o exista.<\/p>\n<p>Em um aplicativo real, h\u00e1 uma chance diferente de zero de que o <code>anexar<\/code> falharia porque o item est\u00e1 faltando e o item imediatamente subsequente <code>adicionar<\/code> falharia devido a uma condi\u00e7\u00e3o de corrida. N\u00e3o escrevi o c\u00f3digo para cobrir isso aqui, mas \u00e9 bem simples. Se isso for importante para voc\u00ea, basta repetir todo o m\u00e9todo modify at\u00e9 que ambos falhem. Voc\u00ea teria que estar tentando fazer com que ele falhasse mais de uma vez.<\/p>\n<h3>O decodificador<\/h3>\n<p>Para usar os dados, precisaremos decodific\u00e1-los, portanto, vamos criar um decodificador r\u00e1pido que possa reverter o que o codificador acima faz (incluindo os acr\u00e9scimos para adicionar e remover).<\/p>\n<div class=\"geshifilter\">\n<div class=\"python geshifilter-python\" style=\"font-family: monospace;\">\n<p><span style=\"color: #ff7700; font-weight: bold;\">def<\/span> decodeSet<span style=\"color: black;\">(<\/span>dados<span style=\"color: black;\">)<\/span>:<br \/>\n<span style=\"color: #483d8b;\">\"\"\"Decodifique um item do cache em um conjunto impl.<\/span><\/p>\n<p>Retorna um indicador de sujeira (dica de compacta\u00e7\u00e3o) e o conjunto<\/p>\n<p>&gt;&gt;&gt; decodeSet('+a +b +c -b -x')<br \/>\n(2, set(['a', 'c']))<br \/>\n&#8220;&#8221;&#8221;<\/p>\n<p>chaves <span style=\"color: #66cc66;\">=<\/span> <span style=\"color: #008000;\">definir<\/span><span style=\"color: black;\">(<\/span><span style=\"color: black;\">)<\/span><br \/>\nsujeira <span style=\"color: #66cc66;\">=<\/span> <span style=\"color: #ff4500;\">0<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">para<\/span> k <span style=\"color: #ff7700; font-weight: bold;\">em<\/span> dados.<span style=\"color: black;\">dividir<\/span><span style=\"color: black;\">(<\/span><span style=\"color: black;\">)<\/span>:<br \/>\nop<span style=\"color: #66cc66;\">,<\/span> chave <span style=\"color: #66cc66;\">=<\/span> k<span style=\"color: black;\">[<\/span><span style=\"color: #ff4500;\">0<\/span><span style=\"color: black;\">]<\/span><span style=\"color: #66cc66;\">,<\/span> k<span style=\"color: black;\">[<\/span><span style=\"color: #ff4500;\">1<\/span>:<span style=\"color: black;\">]<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">se<\/span> op <span style=\"color: #66cc66;\">==<\/span> <span style=\"color: #483d8b;\">&#8216;+&#8217;<\/span>:<br \/>\nchaves.<span style=\"color: black;\">adicionar<\/span><span style=\"color: black;\">(<\/span>chave<span style=\"color: black;\">)<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">elif<\/span> op <span style=\"color: #66cc66;\">==<\/span> <span style=\"color: #483d8b;\">&#8216;-&#8216;<\/span>:<br \/>\nchaves.<span style=\"color: black;\">descartar<\/span><span style=\"color: black;\">(<\/span>chave<span style=\"color: black;\">)<\/span><br \/>\nsujeira +<span style=\"color: #66cc66;\">=<\/span> <span style=\"color: #ff4500;\">1<\/span><\/p>\n<p><span style=\"color: #ff7700; font-weight: bold;\">retorno<\/span> sujeira<span style=\"color: #66cc66;\">,<\/span> chaves<\/p>\n<\/div>\n<\/div>\n<p>Essa \u00e9 a parte mais complicada.<\/p>\n<h3>Recupera\u00e7\u00e3o dos itens<\/h3>\n<p>Agora que podemos codificar, definir e modificar nossos dados, a recupera\u00e7\u00e3o deve ser bastante trivial. Uma passagem b\u00e1sica seria assim:<\/p>\n<div class=\"geshifilter\">\n<div class=\"python geshifilter-python\" style=\"font-family: monospace;\">\n<p><span style=\"color: #ff7700; font-weight: bold;\">def<\/span> itens<span style=\"color: black;\">(<\/span>mc<span style=\"color: #66cc66;\">,<\/span> indexName<span style=\"color: black;\">)<\/span>:<br \/>\n<span style=\"color: #483d8b;\">\"\"\"Recupere os valores atuais do conjunto.\"\"\"<\/span><\/p>\n<p>bandeiras<span style=\"color: #66cc66;\">,<\/span> cas<span style=\"color: #66cc66;\">,<\/span> dados <span style=\"color: #66cc66;\">=<\/span> mc.<span style=\"color: black;\">obter<\/span><span style=\"color: black;\">(<\/span>indexName<span style=\"color: black;\">)<\/span><br \/>\nsujeira<span style=\"color: #66cc66;\">,<\/span> chaves <span style=\"color: #66cc66;\">=<\/span> decodeSet<span style=\"color: black;\">(<\/span>dados<span style=\"color: black;\">)<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">retorno<\/span> chaves<\/p>\n<\/div>\n<\/div>\n<p>\u00c9 basicamente isso. No entanto, este \u00e9 um bom momento para fazer a compacta\u00e7\u00e3o. <code>sujeira<\/code> acima mede a quantidade de fichas de remo\u00e7\u00e3o existentes no conjunto. Se houver muitos, queremos elimin\u00e1-los.<\/p>\n<p>Imagine um <code>LIMITE DE SUJEIRA<\/code> conjunto de n\u00fameros que decide onde queremos fazer a autocompacta\u00e7\u00e3o. Se tivermos mais sujeira do que isso, compactaremos na recupera\u00e7\u00e3o (transformando um \u00fanico get em um \u00fanico get e um \u00fanico <code>CAS<\/code>.<\/p>\n<p>Para esse caso de uso, n\u00e3o nos importamos se o <code>CAS<\/code> \u00e9 bem-sucedido na maioria das vezes, portanto, simplesmente disparamos e esquecemos. \u00c9 seguro (ou seja, n\u00e3o destr\u00f3i nenhum dado), mas n\u00e3o \u00e9 garantido que funcione.<\/p>\n<p>Ent\u00e3o, aqui est\u00e1 uma modifica\u00e7\u00e3o <code>itens<\/code> fun\u00e7\u00e3o de compacta\u00e7\u00e3o condicional:<\/p>\n<div class=\"geshifilter\">\n<div class=\"python geshifilter-python\" style=\"font-family: monospace;\">\n<p><span style=\"color: #ff7700; font-weight: bold;\">def<\/span> itens<span style=\"color: black;\">(<\/span>mc<span style=\"color: #66cc66;\">,<\/span> indexName<span style=\"color: #66cc66;\">,<\/span> forceCompaction<span style=\"color: #66cc66;\">=<\/span><span style=\"color: #008000;\">Falso<\/span><span style=\"color: black;\">)<\/span>:<br \/>\n<span style=\"color: #483d8b;\">\"\"\"Recupere os valores atuais do conjunto.<\/span><\/p>\n<p>Isso pode acionar uma compacta\u00e7\u00e3o se voc\u00ea solicitar ou se a codifica\u00e7\u00e3o for<br \/>\nmuito sujo.\"\"\"<\/p>\n<p>bandeiras<span style=\"color: #66cc66;\">,<\/span> casid<span style=\"color: #66cc66;\">,<\/span> dados <span style=\"color: #66cc66;\">=<\/span> mc.<span style=\"color: black;\">obter<\/span><span style=\"color: black;\">(<\/span>indexName<span style=\"color: black;\">)<\/span><br \/>\nsujeira<span style=\"color: #66cc66;\">,<\/span> chaves <span style=\"color: #66cc66;\">=<\/span> decodeSet<span style=\"color: black;\">(<\/span>dados<span style=\"color: black;\">)<\/span><\/p>\n<p><span style=\"color: #ff7700; font-weight: bold;\">se<\/span> forceCompaction <span style=\"color: #ff7700; font-weight: bold;\">ou<\/span> sujeira <span style=\"color: #66cc66;\">&gt;<\/span> DIRTINESS_THRESHOLD:<br \/>\ncompactado <span style=\"color: #66cc66;\">=<\/span> encodeSet<span style=\"color: black;\">(<\/span>chaves<span style=\"color: black;\">)<\/span><br \/>\nmc.<span style=\"color: black;\">cas<\/span><span style=\"color: black;\">(<\/span>indexName<span style=\"color: #66cc66;\">,<\/span> casid<span style=\"color: #66cc66;\">,<\/span> compactado<span style=\"color: black;\">)<\/span><br \/>\n<span style=\"color: #ff7700; font-weight: bold;\">retorno<\/span> chaves<\/p>\n<\/div>\n<\/div>\n<p>E terminamos.<\/p>\n<h3>Em resumo<\/h3>\n<p><strong>Na pior das hip\u00f3teses, adicionar ao conjunto<\/strong>: 2 viagens de ida e volta (quando o conjunto n\u00e3o existe e precisa ser criado, mas n\u00e3o precisamos saber disso).<\/p>\n<p><strong>Adicionar normal ao conjunto<\/strong>: 1 ida e volta, independentemente do n\u00famero de membros que est\u00e3o sendo adicionados. (Voc\u00ea nem precisa recuperar o valor atual para adicionar ou remover corretamente itens em massa, muito menos transferir tudo de volta).<\/p>\n<p><strong>Recupera\u00e7\u00e3o na pior das hip\u00f3teses<\/strong>: 2 viagens de ida e volta (quando a compacta\u00e7\u00e3o \u00e9 um efeito colateral).<\/p>\n<p><strong>Recupera\u00e7\u00e3o normal<\/strong>: 1 viagem de ida e volta (basta buscar a \u00fanica chave).<\/p>\n<h3>Advert\u00eancias<\/h3>\n<p>Embora o n\u00famero de conjuntos seja praticamente ilimitado, h\u00e1 um tamanho pr\u00e1tico de um \u00fanico conjunto com essa implementa\u00e7\u00e3o. Seria trivial \"fragmentar\" o conjunto em v\u00e1rias chaves (portanto, em v\u00e1rios servidores) se fosse necess\u00e1rio ter conjuntos muito grandes (mais de, digamos, 4.000 itens de 250 bytes).<\/p>\n<p>Como a compacta\u00e7\u00e3o \u00e9 feita na leitura nessa implementa\u00e7\u00e3o, um caso em que voc\u00ea esteja modificando muito, mas lendo raramente, pode n\u00e3o ser perfeito para esse c\u00f3digo. Nesse caso, eu come\u00e7aria a compactar em grava\u00e7\u00f5es aleat\u00f3rias (fazendo com que, na pior das hip\u00f3teses, a adi\u00e7\u00e3o\/remo\u00e7\u00e3o leve cerca de tr\u00eas saltos, onde, de outra forma, seria um).<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[This post also appears on Dustin&#8217;s github blog]. This is something that comes up every once in a while. I usually describe a means of doing it that I think makes sense, but I don\u2019t think I\u2019ve ever described it [&hellip;]<\/p>","protected":false},"author":34,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8992],"class_list":["post-1678","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Maintaining a Set in Memcached - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/maintaining-set-memcached\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Maintaining a Set in Memcached\" \/>\n<meta property=\"og:description\" content=\"[This post also appears on Dustin&#8217;s github blog]. This is something that comes up every once in a while. I usually describe a means of doing it that I think makes sense, but I don\u2019t think I\u2019ve ever described it [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/maintaining-set-memcached\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:38:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-05-03T17:04:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dustin Sallings, Chief Architect, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dustin Sallings, Chief Architect, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/\"},\"author\":{\"name\":\"Dustin Sallings, Chief Architect, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e68b6f4489072ef4a84f60bc437c07d0\"},\"headline\":\"Maintaining a Set in Memcached\",\"datePublished\":\"2014-12-16T19:38:47+00:00\",\"dateModified\":\"2017-05-03T17:04:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/\"},\"wordCount\":1125,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/\",\"name\":\"Maintaining a Set in Memcached - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:38:47+00:00\",\"dateModified\":\"2017-05-03T17:04:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Maintaining a Set in Memcached\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e68b6f4489072ef4a84f60bc437c07d0\",\"name\":\"Dustin Sallings, Chief Architect, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/c5bddc8d7dab8b5c9121282556b0dbff\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g\",\"caption\":\"Dustin Sallings, Chief Architect, Couchbase\"},\"description\":\"Dustin Sallings is a Chief Architect at Couchbase. Dustin is an Author of spymemcached and core contributor to Couchbase and Memcached projects.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/dustin-sallings\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Maintaining a Set in Memcached - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/maintaining-set-memcached\/","og_locale":"pt_BR","og_type":"article","og_title":"Maintaining a Set in Memcached","og_description":"[This post also appears on Dustin&#8217;s github blog]. This is something that comes up every once in a while. I usually describe a means of doing it that I think makes sense, but I don\u2019t think I\u2019ve ever described it [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/maintaining-set-memcached\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:38:47+00:00","article_modified_time":"2017-05-03T17:04:44+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Dustin Sallings, Chief Architect, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dustin Sallings, Chief Architect, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/"},"author":{"name":"Dustin Sallings, Chief Architect, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e68b6f4489072ef4a84f60bc437c07d0"},"headline":"Maintaining a Set in Memcached","datePublished":"2014-12-16T19:38:47+00:00","dateModified":"2017-05-03T17:04:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/"},"wordCount":1125,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/","url":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/","name":"Maintaining a Set in Memcached - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:38:47+00:00","dateModified":"2017-05-03T17:04:44+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/maintaining-set-memcached\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Maintaining a Set in Memcached"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e68b6f4489072ef4a84f60bc437c07d0","name":"Dustin Sallings, arquiteto-chefe da Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/c5bddc8d7dab8b5c9121282556b0dbff","url":"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g","caption":"Dustin Sallings, Chief Architect, Couchbase"},"description":"Dustin Sallings is a Chief Architect at Couchbase. Dustin is an Author of spymemcached and core contributor to Couchbase and Memcached projects.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/dustin-sallings\/"}]}},"authors":[{"term_id":8992,"user_id":34,"is_guest":0,"slug":"dustin-sallings","display_name":"Dustin Sallings, Chief Architect, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/61704e29c6b19851f45c023b2f456b2a0c80ba03ae65e957e39080a0d15065e5?s=96&d=mm&r=g","author_category":"","last_name":"Sallings","first_name":"Dustin","job_title":"","user_url":"","description":"Dustin Sallings \u00e9 arquiteto-chefe da Couchbase. Dustin \u00e9 autor do spymemcached e um dos principais colaboradores do Couchbase e do <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/developer\/dev-guide-3.0\/memcached.html#projects\">Projetos do Memcached.<\/a>"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1678","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1678"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1678\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1678"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1678"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}