{"id":1673,"date":"2014-12-16T19:38:30","date_gmt":"2014-12-16T19:38:29","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1673"},"modified":"2017-04-19T14:08:44","modified_gmt":"2017-04-19T21:08:44","slug":"libmembase-c-interface-membase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/libmembase-c-interface-membase\/","title":{"rendered":"libmembase - interfaz en C para Membase"},"content":{"rendered":"<p>Membase es compatible \"on the wire\" con cualquier servidor memcached si te conectas a la aplicaci\u00f3n <a href=\"https:\/\/www.iana.org\/assignments\/port-numbers\"><u><span style=\"color: #de7008;\">puerto memcached est\u00e1ndar<\/span><\/u><\/a> (registrado por m\u00ed en 2009), por lo que deber\u00edas poder acceder a membase con cualquier cliente \"memcapable\". Respaldando este puerto est\u00e1 nuestro proxy de membase llamado moxi, y detr\u00e1s de escena har\u00e1 la autenticaci\u00f3n SASL y enviar\u00e1 tus peticiones al servidor de membase correcto que contenga el elemento que quieres. Una de las cosas que diferencia a Membase de Memcached es que almacenamos cada elemento en un determinado <a href=\"https:\/\/wiki.membase.org\/display\/membase\/vBuckets\"><u><span style=\"color: #de7008;\">vbucket<\/span><\/u><\/a> que se asigna a un servidor. Cuando crezca o se reduzca el cl\u00faster, membase mover\u00e1 los vbuckets a los nuevos servidores.<\/p>\n<p>No hay nada gratis, as\u00ed que acceder a membase a trav\u00e9s de moxi \"cuesta\" m\u00e1s que hablar directamente con los nodos individuales. Nos gusta referirnos a estos clientes como \"clientes inteligentes\". Como desarrollador en Memcached necesito probar varias cosas, as\u00ed que me adelant\u00e9 y hacke\u00e9 un prototipo r\u00e1pido de tal biblioteca para facilitar mis pruebas. Inicialmente quer\u00eda extender libmemcached con esta funcionalidad, pero eso parec\u00eda ser un gran (y arriesgado) cambio que no ten\u00eda las agallas para hacer en ese momento.<\/p>\n<p>El estado actual de la biblioteca est\u00e1 lejos de la calidad de producci\u00f3n, y con una lista m\u00ednima de funciones compatibles. \u00bfPor qu\u00e9 anunciarlo ahora? Bueno, no creo que encuentre tiempo para implementarlo todo yo mismo, as\u00ed que espero que la gente se una a m\u00ed para a\u00f1adir caracter\u00edsticas a la biblioteca cuando necesiten algo que no est\u00e9 ah\u00ed...<\/p>\n<p>He dise\u00f1ado la biblioteca para ser 100% callback basado e integrado con libevent, por lo que es f\u00e1cil para usted para conectarlo a su aplicaci\u00f3n.<\/p>\n<p>Digamos que quieres crear un flujo TAP y escuchar todas las modificaciones que ocurran en tu cluster. Todo lo que necesitas hacer ser\u00eda:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">\n<p>struct event_base *evbase = event_init();<\/p>\n<p>libmembase_t instance = libmembase_create(host, username, passwd, bucket, evbase);<br \/>\nlibmembase_connect(instancia);<\/p>\n<p>libmembase_tap_filter_t filter;<br \/>\nlibmembase_callback_t callbacks = {<br \/>\n.tap_mutation = tap_mutaci\u00f3n<br \/>\n};<br \/>\nlibmembase_set_callbacks(instancia, &amp;callbacks);<br \/>\nlibmembase_tap_cluster(instancia, filtro, true);<\/p>\n<\/div>\n<\/div>\n<p>A continuaci\u00f3n, se implementar\u00eda la funci\u00f3n de devoluci\u00f3n de llamada del grifo como:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">static void tap_mutation(libmembase_t instance, const void *key, size_t nkey, const void<br \/>\n*data, size_t nbytes, uint32_t flags, uint32_t exp, const void *es, size_t nes)<br \/>\n{<br \/>\n\/\/ Haz lo que quieras con el objeto<br \/>\n}<\/div>\n<\/div>\n<p>Y eso es todo lo que necesitas hacer para aprovechar todo tu cluster :-) Ampliemos el ejemplo para aprovechar <u>varios<\/u> cubos del mismo c\u00f3digo.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">\n<p>struct event_base *evbase = event_init();<\/p>\n<p>libmembase_t instance1 = libmembase_create(host, username, passwd, bucket1, evbase);<br \/>\nlibmembase_t instance2 = libmembase_create(host, username, passwd, bucket2, evbase);<br \/>\nlibmembase_connect(instancia1);<br \/>\nlibmembase_connect(instancia2);<\/p>\n<p>libmembase_tap_filter_t filter;<br \/>\nlibmembase_callback_t callbacks = {<br \/>\n.tap_mutation = tap_mutaci\u00f3n<br \/>\n};<br \/>\nlibmembase_set_callbacks(instancia1, &amp;callbacks);<br \/>\nlibmembase_set_callbacks(instancia2, &amp;callbacks);<br \/>\nlibmembase_tap_cluster(instancia1, filtro, falso);<br \/>\nlibmembase_tap_cluster(instancia2, filtro, falso);<\/p>\n<p>event_base_loop(evbase, 0);<\/p>\n<\/div>\n<\/div>\n<p>El manejador de instancia se pasa a la funci\u00f3n de llamada de retorno, por lo que deber\u00edas ser capaz de saber a qu\u00e9 cubo pertenece cada evento de mutaci\u00f3n.<\/p>\n<p>Como ya he dicho, todas las funciones de la API se basan en retrollamadas, por lo que si quieres recuperar un objeto tienes que registrar una retrollamada para <code><span style=\"color: #999999;\">consiga<\/span><\/code> antes de llamar a <code><span style=\"color: #999999;\">libmembase_mget<\/span><\/code>. Ex:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">libmembase_callback_t callbacks = {<br \/>\n.get = get_callback<br \/>\n};<br \/>\nlibmembase_set_callbacks(instancia, &amp;callbacks);<br \/>\nlibmembase_mget(instance, num_keys, (const void * const *)keys, nkey);\/\/ Si no desea ejecutar su propio bucle de eventos, puede llamar al siguiente m\u00e9todo<br \/>\n\/\/ que ejecutar\u00e1 todos los comandos en cola y esperar\u00e1 sus respuestas antes de salir<br \/>\n\/\/ del bucle de eventos<br \/>\nlibmembase_execute(instancia);<\/p>\n<\/div>\n<\/div>\n<p>La firma para la llamada de retorno get tiene el siguiente aspecto:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace;\">void get_callback(libmembase_t instance, libmembase_error_t error, const void *key,<br \/>\nsize_t nkey, const void *bytes, size_t nbytes, uint32_t flags, uint64_t cas)<br \/>\n{<br \/>\n\/\/ haz lo que quieras...<br \/>\n}<\/div>\n<\/div>\n<p>\u00bfQu\u00e9 le falta a la biblioteca en estos momentos?<\/p>\n<p class=\"rteindent1\">- Manejo adecuado de errores. Ahora mismo estoy usando asserts y abort() para manejar situaciones de error, causando que tu aplicaci\u00f3n se cuelgue... no quieres eso en producci\u00f3n ;-)<br \/>\n- Tiempos de espera .. En este momento s\u00f3lo se agotar\u00e1 el tiempo de espera TCP...\/<br \/>\n- \u00a1Muchas operaciones! S\u00f3lo apoyo get\/add\/replace\/set...<br \/>\n- Buscar r\u00e9plicas ..<br \/>\n- Manejar con gracia el cambio en la lista vbucket<br \/>\n- +++<\/p>\n<p>\u00bfTe apetece hackear algunos de ellos?<\/p>\n<p>Para m\u00e1s informaci\u00f3n sobre d\u00f3nde obtener y compilar libmemcached, haga clic aqu\u00ed.<\/p>","protected":false},"excerpt":{"rendered":"<p>Membase is &#8220;on the wire&#8221; compatible with any memcached server if you connect to the standard memcached port (registered by myself back in 2009), so that you should should be able to access membase with any &#8220;memcapable&#8221; client. Backing this [&hellip;]<\/p>","protected":false},"author":14,"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":[8981],"class_list":["post-1673","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>libmembase \u2013 a C interface to Membase - 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\/es\/libmembase-c-interface-membase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"libmembase \u2013 a C interface to Membase\" \/>\n<meta property=\"og:description\" content=\"Membase is &#8220;on the wire&#8221; compatible with any memcached server if you connect to the standard memcached port (registered by myself back in 2009), so that you should should be able to access membase with any &#8220;memcapable&#8221; client. Backing this [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/libmembase-c-interface-membase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:38:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-19T21:08: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=\"Trond Norbye, Senior Developer, 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=\"Trond Norbye, Senior Developer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/\"},\"author\":{\"name\":\"Trond Norbye, Senior Developer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d\"},\"headline\":\"libmembase \u2013 a C interface to Membase\",\"datePublished\":\"2014-12-16T19:38:29+00:00\",\"dateModified\":\"2017-04-19T21:08:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/\"},\"wordCount\":757,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/\",\"name\":\"libmembase \u2013 a C interface to Membase - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:38:29+00:00\",\"dateModified\":\"2017-04-19T21:08:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#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\/libmembase-c-interface-membase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"libmembase \u2013 a C interface to Membase\"}]},{\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\/ef0f9ff42d878c2fc0ab3a685e96f36d\",\"name\":\"Trond Norbye, Senior Developer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/03d13b4ab5eaa14c91cab7658f04df07\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g\",\"caption\":\"Trond Norbye, Senior Developer, Couchbase\"},\"description\":\"Trond Norbye is a Software Architect at Couchbase. Core contributor to Couchbase &amp; Memcached projects. Created the C\/C++ &amp; node.js Couchbase client libraries.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/trond-norbye\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"libmembase \u2013 a C interface to Membase - 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\/es\/libmembase-c-interface-membase\/","og_locale":"es_MX","og_type":"article","og_title":"libmembase \u2013 a C interface to Membase","og_description":"Membase is &#8220;on the wire&#8221; compatible with any memcached server if you connect to the standard memcached port (registered by myself back in 2009), so that you should should be able to access membase with any &#8220;memcapable&#8221; client. Backing this [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/libmembase-c-interface-membase\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:38:29+00:00","article_modified_time":"2017-04-19T21:08: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":"Trond Norbye, Senior Developer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Trond Norbye, Senior Developer, Couchbase","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/"},"author":{"name":"Trond Norbye, Senior Developer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ef0f9ff42d878c2fc0ab3a685e96f36d"},"headline":"libmembase \u2013 a C interface to Membase","datePublished":"2014-12-16T19:38:29+00:00","dateModified":"2017-04-19T21:08:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/"},"wordCount":757,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/","url":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/","name":"libmembase \u2013 a C interface to Membase - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:38:29+00:00","dateModified":"2017-04-19T21:08:44+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/libmembase-c-interface-membase\/#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\/libmembase-c-interface-membase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"libmembase \u2013 a C interface to Membase"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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\/ef0f9ff42d878c2fc0ab3a685e96f36d","name":"Trond Norbye, Desarrollador Senior, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/03d13b4ab5eaa14c91cab7658f04df07","url":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","caption":"Trond Norbye, Senior Developer, Couchbase"},"description":"Trond Norbye es Arquitecto de Software en Couchbase. Colaborador principal de los proyectos Couchbase y Memcached. Cre\u00f3 las bibliotecas de cliente C\/C++ y node.js de Couchbase.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/trond-norbye\/"}]}},"authors":[{"term_id":8981,"user_id":14,"is_guest":0,"slug":"trond-norbye","display_name":"Trond Norbye, Senior Developer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bf3c00ca228efa25f7bfc168f566d6389279b44d4bbba4683c260a8bf33da03d?s=96&d=mm&r=g","author_category":"","last_name":"Norbye","first_name":"Trond","job_title":"","user_url":"","description":"Trond Norbye es Arquitecto de Software en Couchbase. Colaborador principal de los proyectos Couchbase y Memcached. Cre\u00f3 las bibliotecas de cliente C\/C++ y node.js de Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1673"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1673\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=1673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1673"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}