{"id":2039,"date":"2015-12-16T19:37:00","date_gmt":"2015-12-16T19:37:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2039"},"modified":"2024-09-12T01:12:09","modified_gmt":"2024-09-12T08:12:09","slug":"couchbase-spring-cache","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-spring-cache\/","title":{"rendered":"Copia de seguridad de Spring Cache con Couchbase"},"content":{"rendered":"<p><!-- Backing Spring Cache with Couchbase --><\/p>\n<p>En esta entrada del blog, descubriremos c\u00f3mo almacenar datos en cach\u00e9 f\u00e1cilmente utilizando <code>Cach\u00e9 de primavera<\/code> y <code>Couchbase<\/code> como gerente de una tienda de respaldo.<\/p>\n<p><strong>\u00cdndice<\/strong><br \/>\n<!-- TOC depth:6 withLinks:1 updateOnSave:1 orderedList:0 --><\/p>\n<ul>\n<li><a href=\"#a-word-of-introduction\">Introducci\u00f3n<\/a><\/li>\n<li><a href=\"#the-cache-abstraction\">En <code>Cach\u00e9<\/code> Abstracci\u00f3n<\/a><\/li>\n<li><a href=\"#the-couchbase-implementation\">Implementaci\u00f3n de Couchbase<\/a><\/li>\n<li><a href=\"#getting-couchbase-spring-cache-and-putting-it-to-work\">En <code>couchbase-spring-cache<\/code> y ponerlo en pr\u00e1ctica<\/a>\n<ul>\n<li><a href=\"#downloading-and-building-the-couchbase-spring-cache-project\">Descargar y construir el <code>couchbase-spring-cache<\/code> proyecto<\/a><\/li>\n<li><a href=\"#starting-a-tutorial-project\">Iniciar un proyecto tutorial<\/a><\/li>\n<li><a href=\"#add-book-management-entity-and-repository\">A\u00f1adir entidad de gesti\u00f3n de libros y repositorio<\/a><\/li>\n<li><a href=\"#the-main-spring-boot-application\">Principal <code>Spring Boot<\/code> Aplicaci\u00f3n<\/a><\/li>\n<li><a href=\"#adding-caching-capabilities\">A\u00f1adir funciones de cach\u00e9<\/a><\/li>\n<li><a href=\"#activate-caching-in-simplebookrepository\">Activar cach\u00e9 en <code>SimpleBookRepository<\/code><\/a><\/li>\n<li><a href=\"#seeing-the-data-in-couchbase\">Ver los datos en Couchbase<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#conclusion\">Conclusi\u00f3n<\/a><br \/>\n<!-- \/TOC --><\/li>\n<\/ul>\n<h2 id=\"a-word-of-introduction\">Introducci\u00f3n<\/h2>\n<p>Hubo mucho trabajo relacionado con <code>Primavera<\/code> \u00a1\u00faltimamente! Hemos estado ocupados trabajando en el <code><a href=\"https:\/\/docs.couchbase.com\/sdk-extensions\/spring-data-couchbase.html\">Spring Data Couchbase<\/a><\/code> conector para actualizarlo a la generaci\u00f3n 2.x del SDK de Java, lo que conlleva <a href=\"https:\/\/www.couchbase.com\/blog\/es\/spring-data-couchbase-2.0-preview\/\" target=\"_blank\" rel=\"noopener noreferrer\">una serie de nuevas funciones y mejoras<\/a> (pero hablaremos de ello m\u00e1s adelante)...<\/p>\n<p>En el camino, nos dimos cuenta de que hay algunas clases en el proyecto que no est\u00e1n realmente relacionadas directamente con <code>Datos de primavera<\/code> y, como tal, no ha tenido que ce\u00f1irse a su ciclo formal de lanzamientos \"Release Train\": <strong>el <code>cach\u00e9<\/code> paquete<\/strong>.<\/p>\n<p>As\u00ed que empezamos un nuevo y sencillo proyecto de ejemplo de Spring Boot Cache para alojar <strong>el <code>2.x<\/code> generaci\u00f3n del <code>Cach\u00e9 Couchbase Spring<\/code> aplicaci\u00f3n<\/strong> en github (<a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-spring-cache\" target=\"_blank\" rel=\"noopener noreferrer\"><code>couchbaselabs\/couchbase-spring-cache<\/code><\/a>).<\/p>\n<p>Veamos c\u00f3mo se puede aprovechar para introducir f\u00e1cilmente el almacenamiento en cach\u00e9 respaldado por Couchbase en un proyecto Spring.<\/p>\n<h2 id=\"the-cache-abstraction\">En <code>Cach\u00e9<\/code> Abstracci\u00f3n<\/h2>\n<p>Spring Framework viene con una abstracci\u00f3n ligera de un <code>Cach\u00e9<\/code> que los desarrolladores pueden utilizar autom\u00e1ticamente anotando m\u00e9todos en sus clases (por ejemplo, en una clase <code>@Repositorio<\/code> estereotipo).<\/p>\n<p>Para hacer uso de los mecanismos de cach\u00e9 de arranque de Spring, basta con anotar los m\u00e9todos con un pu\u00f1ado de anotaciones relacionadas con la cach\u00e9:<\/p>\n<ul>\n<li><code>@Cacheable<\/code> dejar\u00e1 que se ejecute la primera invocaci\u00f3n del m\u00e9todo anotado con un conjunto determinado de par\u00e1metros de entrada, pero el resultado se almacenar\u00e1 en cach\u00e9 y las invocaciones posteriores (con el mismo conjunto) se servir\u00e1n de forma transparente desde la cach\u00e9.<\/li>\n<li><code>@CachePut<\/code> siempre invocar\u00e1 el m\u00e9todo y almacenar\u00e1 en cach\u00e9 su resultado (a diferencia de <code>@Cacheable<\/code> no optimiza el flujo de invocaci\u00f3n).<\/li>\n<li><code>@CacheEvict<\/code> calcular\u00e1 una clave de cach\u00e9 a partir de los par\u00e1metros del m\u00e9todo anotado y la eliminar\u00e1 de la cach\u00e9 cuando se ejecute el m\u00e9todo (por ejemplo, porque invocar este m\u00e9todo hace que una entrada sea obsoleta).<\/li>\n<li><code>@Caching<\/code> permite reagrupar comportamientos de la anotaci\u00f3n anterior en una sola.<\/li>\n<li><code>@CacheConfig<\/code> nos permite tener par\u00e1metros de cach\u00e9 comunes establecidos en toda una clase.<\/li>\n<\/ul>\n<h2 id=\"the-couchbase-implementation\">Implementaci\u00f3n de Couchbase<\/h2>\n<p>El framework establece el mecanismo abstracto, pero debe elegirse una implementaci\u00f3n de respaldo real. Spring viene con algunas de ellas (en memoria <code>Mapa<\/code>, <code>EhCache<\/code>, <code>Gemfire<\/code>...), pero es absolutamente posible definir otras personalizadas, <strong>simplemente implantando un <code>Cach\u00e9<\/code> y un <code>Gestor de cach\u00e9<\/code> y hacerlo visible en el contexto de Spring<\/strong>.<\/p>\n<p>Ese es el objetivo de <code>couchbase-spring-cache<\/code>.<\/p>\n<p>Cada cach\u00e9 tiene un nombre, y cada valor en la cach\u00e9 tiene una clave de cach\u00e9. La implementaci\u00f3n de Couchbase traducir\u00e1 eso en una clave de documento que refleje ese...<\/p>\n<ul>\n<li>este es un <code>Cach\u00e9<\/code> documento relacionado (por defecto utilizando el prefijo \"<code>cach\u00e9:<\/code>&#8220;)<\/li>\n<li>se refiere a un determinado <code>Cach\u00e9<\/code> (a\u00f1adiendo el <code>NOMBRE_DE_LA_CACHE<\/code> al prefijo anterior)<\/li>\n<li>almacena un valor de cach\u00e9 concreto en <code>CACHE_KEY<\/code> (as\u00ed que en general \"<strong><code>cache:CACHE_NAME:CACHE_KEY<\/code><\/strong>&#8220;).<\/li>\n<\/ul>\n<p>Por ahora los valores deben ser <code>Serializable<\/code> y se almacenan como <code>SerializableDocument<\/code> del <code>2.x<\/code> Java SDK, pero en el futuro podr\u00edan ofrecerse alternativas de transcodificaci\u00f3n, por ejemplo <code>JSON<\/code>\/<code>JsonDocument<\/code>&#8230;<\/p>\n<h2 id=\"getting-couchbase-spring-cache-and-putting-it-to-work\">En <code>couchbase-spring-cache<\/code> y ponerlo en pr\u00e1ctica<\/h2>\n<p>Nota:<\/p>\n<blockquote><p>En el momento de escribir estas l\u00edneas, el proyecto se encuentra en <code>1.0-SNAPSHOT<\/code> por lo que no est\u00e1 disponible en <code>Maven Central<\/code> todav\u00eda. Tendr\u00e1s que compilar manualmente el jar y a\u00f1adirlo a tu repositorio local de Maven.<\/p><\/blockquote>\n<h2 id=\"downloading-and-building-the-couchbase-spring-cache-project\">Descargar y construir el <code>couchbase-spring-cache<\/code> proyecto<\/h2>\n<p>Comienza clonando el proyecto desde github:<\/p>\n<pre class=\"bash\"><code>git clone https:\/\/github.com\/couchbaselabs\/couchbase-spring-cache.git\r\ncd couchbase-spring-cache<\/code><\/pre>\n<p>A continuaci\u00f3n, comp\u00edlelo e inst\u00e1lelo localmente utilizando Maven:<\/p>\n<pre class=\"bash\"><code>mvn clean install<\/code><\/pre>\n<p>Deber\u00eda ver un mensaje de \u00e9xito indicando la versi\u00f3n creada y d\u00f3nde se instal\u00f3:<\/p>\n<pre>[INFO] Installing \/path\/to\/couchbase-spring-cache\/target\/couchbase-spring-cache-<span style=\"background-color: yellow\">1.0-SNAPSHOT.jar<\/span>\r\n\r\na <span style=\"background-color: orange\">\/path\/to\/.m2\/repository\/<\/span><span style=\"background-color: lightgrey\">com\/couchbase\/client\/couchbase-spring-cache\/1.0-SNAPSHOT\/couchbase-spring-cache-1.0-SNAPSHOT.jar<\/span>\r\n\r\n[INFO] Installing \/path\/to\/couchbase-spring-cache\/pom.xml\r\n\r\nto \/path\/to\/.m2\/repository\/com\/couchbase\/client\/couchbase-spring-cache\/1.0-SNAPSHOT\/couchbase-spring-cache-1.0-SNAPSHOT.pom\r\n\r\n[INFO] ------------------------------------------------------------------------\r\n\r\n[INFO] BUILD SUCCESS\r\n\r\n[INFO] ------------------------------------------------------------------------\r\n\r\n<\/pre>\n<h2 id=\"starting-a-tutorial-project\">Iniciar un proyecto tutorial<\/h2>\n<p>Construiremos un proyecto de ejemplo de Spring Cache utilizando Maven y <code>Spring Boot<\/code> como base.<br \/>\nComience por crear la siguiente estructura de directorios para el proyecto en un directorio ra\u00edz de su elecci\u00f3n (utilizaremos <code>cbcache<\/code> aqu\u00ed):<\/p>\n<pre><code> cbcache\r\n    \u2514\u2500\u2500 src\r\n        \u2514\u2500\u2500 main\r\n            \u2514\u2500\u2500 java\r\n                \u2514\u2500\u2500 com\r\n                    \u2514\u2500\u2500 couchbase\r\n                        \u2514\u2500\u2500 demo<\/code><\/pre>\n<p>Por ejemplo, utilice el siguiente comando:<\/p>\n<pre class=\"bash\"><code>mkdir -p cbcache\/src\/main\/java\/com\/couchbase\/demo\/\r\ncd cbcache<\/code><\/pre>\n<p>A continuaci\u00f3n, inicie el POM en la ra\u00edz de cbcache en <code>pom.xml<\/code> con el siguiente contenido:<\/p>\n<pre class=\"xml\"><code><!--?xml version=\"1.0\" encoding=\"UTF-8\"?-->\r\n\r\n    4.0.0\r\n\r\n    com.couchbase.demo\r\n    cbcache\r\n    0.1.0\r\n\r\n    \r\n        org.springframework.boot\r\n        spring-boot-starter-parent\r\n        1.3.0.RELEASE\r\n    \r\n\r\n    \r\n        1.8\r\n    \r\n\r\n    \r\n        \r\n            org.springframework.boot\r\n            spring-boot-starter\r\n        \r\n        \r\n            org.springframework\r\n            spring-context\r\n        \r\n        <!--the couchbase cache artifact we built earlier-->\r\n        \r\n            com.couchbase.client\r\n            couchbase-spring-cache\r\n            1.0-SNAPSHOT\r\n        \r\n    \r\n\r\n    \r\n        \r\n            \r\n                org.springframework.boot\r\n                spring-boot-maven-plugin\r\n            \r\n        \r\n    \r\n\r\n<\/code><\/pre>\n<h2 id=\"add-book-management-entity-and-repository\">A\u00f1adir entidad de gesti\u00f3n de libros y repositorio<\/h2>\n<p>Utilizaremos el ejemplo de un <code>Reserve<\/code> (tal y como se encuentra en el repositorio \"<a href=\"https:\/\/spring.io\/guides\/gs\/caching\/\">COMENZAR - Almacenamiento de datos en cach\u00e9 con Spring<\/a>\"gu\u00eda oficial de Spring.io).<\/p>\n<p>Crear el <code>Reserve<\/code> clase de entidad en <code>src\/main\/java\/com\/couchbase\/demo\/Libro.java<\/code>:<\/p>\n<pre class=\"java\"><code>import java.io.Serializable;\r\n\r\npublic class Book implements Serializable {\r\n\r\n    private static final long serialVersionUID = -7674163614777124381L;\r\n\r\n    private String isbn;\r\n    private String title;\r\n\r\n    public Book(String isbn, String title) {\r\n        this.isbn = isbn;\r\n        this.title = title;\r\n    }\r\n\r\n    public String getIsbn() {\r\n        return isbn;\r\n    }\r\n\r\n    public void setIsbn(String isbn) {\r\n        this.isbn = isbn;\r\n    }\r\n\r\n    public String getTitle() {\r\n        return title;\r\n    }\r\n\r\n    public void setTitle(String title) {\r\n        this.title = title;\r\n    }\r\n\r\n    @Override\r\n    public String toString() {\r\n        return \"Book{\" + \"isbn='\" + isbn + ''' + \", title='\" + title + ''' + '}';\r\n    }\r\n}<\/code><\/pre>\n<blockquote><p>Tenga en cuenta la <code>Reserve<\/code> clase es <code>Serializable<\/code>Esto es importante por ahora para el almacenamiento de Couchbase.<\/p><\/blockquote>\n<p>Crear una interfaz de repositorio simple y una implementaci\u00f3n ingenua que simule un retraso:<\/p>\n<p>en <code>src\/main\/java\/com\/couchbase\/demo\/BookRepository.java<\/code>:<\/p>\n<pre class=\"java\"><code>package com.couchbase.demo;\r\n\r\npublic interface BookRepository {\r\n\r\n    Book getByIsbn(String isbn);\r\n\r\n}<\/code><\/pre>\n<p>en <code>src\/main\/java\/com\/couchbase\/demo\/SimpleBookRepository.java<\/code>:<\/p>\n<pre class=\"java\"><code>package com.couchbase.demo;\r\n\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n\r\nimport org.springframework.stereotype.Component;\r\n\r\n@Component\r\npublic class SimpleBookRepository implements BookRepository {\r\n\r\n    private static final Logger log = LoggerFactory.getLogger(SimpleBookRepository.class);\r\n\r\n    @Override\r\n    public Book getByIsbn(String isbn) {\r\n        simulateSlowService();\r\n        Book result = new Book(isbn, \"Some book\");\r\n        log.info(\"Actual fetch of \" + isbn);\r\n        return result;\r\n    }\r\n\r\n    \/\/ Don't do this at home\r\n    private void simulateSlowService() {\r\n        try {\r\n            long time = 5000L;\r\n            Thread.sleep(time);\r\n        } catch (InterruptedException e) {\r\n            throw new IllegalStateException(e);\r\n        }\r\n    }\r\n\r\n}<\/code><\/pre>\n<h2 id=\"the-main-spring-boot-application\">Principal <code>Spring Boot<\/code> Aplicaci\u00f3n<\/h2>\n<p>Por \u00faltimo, cree una Aplicaci\u00f3n que utilice el repositorio en <code>src\/main\/java\/com\/couchbase\/demo\/Application.java<\/code>:<\/p>\n<pre class=\"java\"><code>package com.couchbase.demo;\r\n\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.boot.CommandLineRunner;\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.stereotype.Component;\r\n\r\n@SpringBootApplication\r\npublic class Application {\r\n\r\n    private static final Logger log = LoggerFactory.getLogger(Application.class);\r\n\r\n    @Component\r\n    static class Runner implements CommandLineRunner {\r\n        @Autowired\r\n        private BookRepository bookRepository;\r\n\r\n        @Override\r\n        public void run(String... args) throws Exception {\r\n            long start;\r\n            log.info(\".... Fetching books\");\r\n            fetchAndLog(\"isbn-1234\");\r\n            fetchAndLog(\"isbn-1234\");\r\n            fetchAndLog(\"isbn-1234\");\r\n            fetchAndLog(\"isbn-8888\");\r\n            fetchAndLog(\"isbn-8888\");\r\n        }\r\n\r\n        private void fetchAndLog(String isbn) {\r\n            long start = System.currentTimeMillis();\r\n            Book book = bookRepository.getByIsbn(isbn);\r\n            long time = System.currentTimeMillis() - start;\r\n            log.info(isbn + \" --&gt; \" + book + \" in \" + time + \"ms\");\r\n        }\r\n    }\r\n\r\n    public static void main(String[] args) {\r\n        SpringApplication.run(Application.class, args);\r\n    }\r\n}<\/code><\/pre>\n<p>Si ejecuta la funci\u00f3n <code>Aplicaci\u00f3n<\/code>'s <code>principal<\/code> en su IDE (o si invoca \"<code>mvn spring-boot:ejecutar<\/code>\" desde la l\u00ednea de comandos), observar\u00e1 que todas las llamadas son, en efecto, bastante lentas:<\/p>\n<pre class=\"txt\"><code>[...] .... Fetching books\r\n[...] Actual fetch of isbn-1234\r\n[...] isbn-1234 --&gt; Book{isbn='isbn-1234', title='Some book'} in 5001ms\r\n[...] Actual fetch of isbn-1234\r\n[...] isbn-1234 --&gt; Book{isbn='isbn-1234', title='Some book'} in 5004ms\r\n[...] Actual fetch of isbn-1234\r\n[...] isbn-1234 --&gt; Book{isbn='isbn-1234', title='Some book'} in 5004ms\r\n[...] Actual fetch of isbn-8888\r\n[...] isbn-8888 --&gt; Book{isbn='isbn-8888', title='Some book'} in 5003ms\r\n[...] Actual fetch of isbn-8888\r\n[...] isbn-8888 --&gt; Book{isbn='isbn-8888', title='Some book'} in 5003ms<\/code><\/pre>\n<h2 id=\"adding-caching-capabilities\">A\u00f1adir capacidades de almacenamiento en cach\u00e9 de Spring Boot<\/h2>\n<p>Para activar el almacenamiento en cach\u00e9, debe seguir algunos pasos: en primer lugar, debe ofrecer a Spring un archivo <code>Gestor de cach\u00e9<\/code> <code>@Bean<\/code>&#8230;<\/p>\n<p>Dado que vamos a utilizar el <code>CouchbaseCacheManager<\/code> (por supuesto), necesitaremos conectarnos a un <code>Grupo<\/code> y utilizar un <code>Cubo<\/code> (la unidad de almacenamiento donde couchbase almacenar\u00e1 los documentos de la cach\u00e9).<br \/>\nAs\u00ed que el <code>CouchbaseCacheManager<\/code> necesita una correspondencia entre <code>Cach\u00e9<\/code> y los correspondientes <code>Cubo<\/code> a utilizar, pasado como <code>Mapa<\/code>.<\/p>\n<p>En <code>src\/main\/java\/com\/couchbase\/demo\/Application.java<\/code>a\u00f1ade las siguientes declaraciones de bean:<\/p>\n<pre class=\"java\"><code>  public static final String BOOK_CACHE = \"books\";\r\n\r\n  @Bean(destroyMethod = \"disconnect\")\r\n  public Cluster cluster() {\r\n      \/\/this connects to a Couchbase instance running on localhost\r\n      return CouchbaseCluster.create();\r\n  }\r\n\r\n  @Bean(destroyMethod = \"close\")\r\n  public Bucket bucket() {\r\n      \/\/this will be the bucket where every cache-related data will be stored\r\n      \/\/note that the bucket \"default\" must exist\r\n      return cluster().openBucket(\"default\", \"\");\r\n  }\r\n\r\n  @Bean\r\n  public CacheManager cacheManager() {\r\n      Map&lt;String, Bucket&gt; mapping = new HashMap&lt;String, Bucket&gt;();\r\n      \/\/we'll make this cache manager recognize a single cache named \"books\"\r\n      mapping.put(BOOK_CACHE, bucket());\r\n      return new CouchbaseCacheManager(mapping);\r\n  }<\/code><\/pre>\n<p>A continuaci\u00f3n, desea activar el escaneo de anotaciones relacionadas con la cach\u00e9 y el proxy asociado colocando la etiqueta <code>@HabilitarCach\u00e9<\/code> en el <code>Aplicaci\u00f3n<\/code> clase.<\/p>\n<h2 id=\"activate-caching-in-simplebookrepository\">Activar cach\u00e9 en <code>SimpleBookRepository<\/code><\/h2>\n<p>Veamos c\u00f3mo activar el almacenamiento en cach\u00e9 real en nuestro <code>SimpleBookRepository<\/code> y compruebe c\u00f3mo se comporta la aplicaci\u00f3n despu\u00e9s de eso.<\/p>\n<p>Para hacer <code>getByIsbn<\/code> autom\u00e1ticamente en cach\u00e9 en la primera invocaci\u00f3n y servir las invocaciones posteriores con datos de la cach\u00e9, simplemente an\u00f3telo as\u00ed:<\/p>\n<pre class=\"java\"><code>    @Override\r\n    @Cacheable(Application.BOOK_CACHE) \/\/using the name of the cache we declared earlier\r\n    public Book getByIsbn(String isbn) {\r\n        simulateSlowService();\r\n        Book result = new Book(isbn, \"Some book\");\r\n        log.info(\"Actual fetch of \" + isbn);\r\n        return result;\r\n    }<\/code><\/pre>\n<p>Vamos a ejecutar la aplicaci\u00f3n de nuevo y ver c\u00f3mo se comporta ahora:<\/p>\n<pre class=\"txt\"><code>[...] .... Fetching books\r\n[...] Actual fetch of isbn-1234\r\n[...] isbn-1234 --&gt; Book{isbn='isbn-1234', title='Some book'} in 5022ms\r\n[...] isbn-1234 --&gt; Book{isbn='isbn-1234', title='Some book'} in 3ms\r\n[...] isbn-1234 --&gt; Book{isbn='isbn-1234', title='Some book'} in 1ms\r\n[...] Actual fetch of isbn-8888\r\n[...] isbn-8888 --&gt; Book{isbn='isbn-8888', title='Some book'} in 5007ms\r\n[...] isbn-8888 --&gt; Book{isbn='isbn-8888', title='Some book'} in 1ms<\/code><\/pre>\n<p>\u00a1Vaya! Esto es mucho mejor para las invocaciones m\u00e1s all\u00e1 de la primera, parece que efectivamente se almacena en cach\u00e9 :-)<\/p>\n<h2 id=\"seeing-the-data-in-couchbase\">Ver los datos en Couchbase<\/h2>\n<p>Echemos un vistazo r\u00e1pido a la consola web para verificar que estos magn\u00edficos tiempos pueden atribuirse a Couchbase:<\/p>\n<ul>\n<li>abra una nueva pesta\u00f1a en su navegador y navegue hasta <a href=\"https:\/\/localhost:8091\"><code>https:\/\/localhost:8091<\/code><\/a>.<\/li>\n<li>conectarse a la consola web.<\/li>\n<li>ir a la <code>Cubos de datos<\/code> y haga clic en <code>Documentos<\/code> para el cubo que haya elegido utilizar (\"por defecto\").<\/li>\n<\/ul>\n<p>Lo que ve en esta pantalla (<a href=\"https:\/\/localhost:8091\/index.html#sec=documents&amp;viewsBucket=default\">enlace r\u00e1pido<\/a> para los perezosos) deber\u00eda ser similar a esto:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10261 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/cacheddocs.png\" alt=\"Spring Cache documents in Couchbase console\" width=\"789\" height=\"545\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/cacheddocs.png 789w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/cacheddocs-300x207.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/cacheddocs-768x530.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/cacheddocs-20x14.png 20w\" sizes=\"auto, (max-width: 789px) 100vw, 789px\" \/><\/p>\n<p>Podemos ver que ambos libros se almacenaron en cach\u00e9 en couchbase, utilizando el m\u00e9todo <strong><code>cache:CACHE_NAME:CACHE_KEY<\/code><\/strong> para los ID de los documentos.<\/p>\n<h2 id=\"conclusion\">Conclusi\u00f3n<\/h2>\n<p>Couchbase le facilita el almacenamiento en cach\u00e9.<\/p>\n<p>Hay mucho m\u00e1s que <code>Cach\u00e9 de primavera<\/code> puede hacer por usted (por ejemplo, elegir c\u00f3mo crear la clave de cach\u00e9, cach\u00e9 condicional, desalojo de cach\u00e9, etc...), y hay especificidades de <code>couchbase-spring-cache<\/code> (por ejemplo, para la limpieza de la cach\u00e9 puede elegir entre utilizar una vista que s\u00f3lo eliminar\u00e1 el documento relevante o, si su cubo est\u00e1 dedicado a una \u00fanica cach\u00e9, utilizar la funci\u00f3n <code>descarga<\/code> mecanismo...).<\/p>\n<p>Espero que este tutorial introductorio te haya abierto el apetito sobre la facilidad de uso de la memoria cach\u00e9 con <code>Cach\u00e9 de primavera<\/code> y <code>Couchbase<\/code>!<\/p>\n<p>Los pr\u00f3ximos pasos ser\u00e1n probablemente introducir formatos de almacenamiento alternativos (como JSON) y ofrecer el artefacto en Maven Central o en un repositorio Maven similar de acceso p\u00fablico (<a href=\"https:\/\/bintray.com\">Bintray<\/a> \u00bfalguien?)...<\/p>\n<p>Est\u00e9 atento a las pr\u00f3ximas noticias relacionadas con la primavera.<\/p>\n<p>Mientras tanto, feliz codificaci\u00f3n :)<\/p>","protected":false},"excerpt":{"rendered":"<p>In this blog post, we&#8217;ll discover how to cache data easily using Spring Cache and Couchbase as a backing store manager. Table of Contents A Word Of Introduction The Cache Abstraction The Couchbase Implementation Getting couchbase-spring-cache and Putting it to [&hellip;]<\/p>","protected":false},"author":48,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1818],"tags":[1511,1424,1465],"ppma_author":[9022],"class_list":["post-2039","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-cache","tag-spring","tag-spring-data"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cache Data with Spring Cache and Couchbase as Backing Store<\/title>\n<meta name=\"description\" content=\"Find out how to cache data by utilizing Spring Cache and Couchbase as a backing store. Easy caching using Couchbase is now at your fingertips!\" \/>\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\/couchbase-spring-cache\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Backing Spring Cache With Couchbase\" \/>\n<meta property=\"og:description\" content=\"Find out how to cache data by utilizing Spring Cache and Couchbase as a backing store. Easy caching using Couchbase is now at your fingertips!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-spring-cache\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-16T19:37:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T08:12:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/cacheddocs.png\" \/>\n<meta name=\"author\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/\"},\"author\":{\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\"},\"headline\":\"Backing Spring Cache With Couchbase\",\"datePublished\":\"2015-12-16T19:37:00+00:00\",\"dateModified\":\"2024-09-12T08:12:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/\"},\"wordCount\":1117,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Cache\",\"spring\",\"spring-data\"],\"articleSection\":[\"Java\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/\",\"name\":\"Cache Data with Spring Cache and Couchbase as Backing Store\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-12-16T19:37:00+00:00\",\"dateModified\":\"2024-09-12T08:12:09+00:00\",\"description\":\"Find out how to cache data by utilizing Spring Cache and Couchbase as a backing store. Easy caching using Couchbase is now at your fingertips!\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#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\/couchbase-spring-cache\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backing Spring Cache With Couchbase\"}]},{\"@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\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"caption\":\"Simon Basle, Software Engineer, Pivotal\"},\"description\":\"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cache Data with Spring Cache and Couchbase as Backing Store","description":"Descubre c\u00f3mo almacenar datos en cach\u00e9 utilizando Spring Cache y Couchbase como almac\u00e9n de respaldo. Ahora puedes almacenar datos en cach\u00e9 f\u00e1cilmente con Couchbase.","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\/couchbase-spring-cache\/","og_locale":"es_MX","og_type":"article","og_title":"Backing Spring Cache With Couchbase","og_description":"Find out how to cache data by utilizing Spring Cache and Couchbase as a backing store. Easy caching using Couchbase is now at your fingertips!","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-spring-cache\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-12-16T19:37:00+00:00","article_modified_time":"2024-09-12T08:12:09+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/cacheddocs.png","type":"","width":"","height":""}],"author":"Simon Basle, Software Engineer, Pivotal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon Basle, Software Engineer, Pivotal","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/"},"author":{"name":"Simon Basle, Software Engineer, Pivotal","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1"},"headline":"Backing Spring Cache With Couchbase","datePublished":"2015-12-16T19:37:00+00:00","dateModified":"2024-09-12T08:12:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/"},"wordCount":1117,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Cache","spring","spring-data"],"articleSection":["Java"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/","name":"Cache Data with Spring Cache and Couchbase as Backing Store","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-12-16T19:37:00+00:00","dateModified":"2024-09-12T08:12:09+00:00","description":"Descubre c\u00f3mo almacenar datos en cach\u00e9 utilizando Spring Cache y Couchbase como almac\u00e9n de respaldo. Ahora puedes almacenar datos en cach\u00e9 f\u00e1cilmente con Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#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\/couchbase-spring-cache\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Backing Spring Cache With Couchbase"}]},{"@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\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, Ingeniero de Software, Pivotal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854","url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","caption":"Simon Basle, Software Engineer, Pivotal"},"description":"Simon Basl_ es un Ingeniero de Software residente en Par\u00eds que trabaja en el equipo Spring de Pivotal. Anteriormente, trabaj\u00f3 en el equipo de Couchbase Java SDK. Sus intereses abarcan aspectos de dise\u00f1o de software (OOP, patrones de dise\u00f1o, arquitectura de software), clientes ricos, lo que hay m\u00e1s all\u00e1 del c\u00f3digo (integraci\u00f3n continua, (D)VCS, mejores pr\u00e1cticas) y programaci\u00f3n reactiva. Tambi\u00e9n es editor de la versi\u00f3n francesa de InfoQ.com.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/simon-basle\/"}]}},"authors":[{"term_id":9022,"user_id":48,"is_guest":0,"slug":"simon-basle","display_name":"Simon Basle, Software Engineer, Pivotal","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","author_category":"","last_name":"Basle","first_name":"Simon","job_title":"","user_url":"","description":"Simon Basl_ es un Ingeniero de Software residente en Par\u00eds que trabaja en el equipo Spring de Pivotal. Anteriormente, trabaj\u00f3 en el equipo de Couchbase Java SDK. Sus intereses abarcan aspectos de dise\u00f1o de software (OOP, patrones de dise\u00f1o, arquitectura de software), clientes ricos, lo que hay m\u00e1s all\u00e1 del c\u00f3digo (integraci\u00f3n continua, (D)VCS, mejores pr\u00e1cticas) y programaci\u00f3n reactiva. Tambi\u00e9n es editor de la versi\u00f3n francesa de InfoQ.com."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2039","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\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2039"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2039\/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=2039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2039"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}