{"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\/pt\/couchbase-spring-cache\/","title":{"rendered":"Fazendo backup do Spring Cache com o Couchbase"},"content":{"rendered":"<p><!-- Backing Spring Cache with Couchbase --><\/p>\n<p>Nesta postagem do blog, descobriremos como armazenar dados em cache facilmente usando <code>Spring Cache<\/code> e <code>Couchbase<\/code> como gerente de loja de apoio.<\/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\">Uma palavra de apresenta\u00e7\u00e3o<\/a><\/li>\n<li><a href=\"#the-cache-abstraction\">O <code>Cache<\/code> Abstra\u00e7\u00e3o<\/a><\/li>\n<li><a href=\"#the-couchbase-implementation\">A implementa\u00e7\u00e3o do Couchbase<\/a><\/li>\n<li><a href=\"#getting-couchbase-spring-cache-and-putting-it-to-work\">Obtendo <code>couchbase-spring-cache<\/code> e colocando-o em pr\u00e1tica<\/a>\n<ul>\n<li><a href=\"#downloading-and-building-the-couchbase-spring-cache-project\">Download e cria\u00e7\u00e3o do <code>couchbase-spring-cache<\/code> projeto<\/a><\/li>\n<li><a href=\"#starting-a-tutorial-project\">Iniciando um projeto de tutorial<\/a><\/li>\n<li><a href=\"#add-book-management-entity-and-repository\">Adicionar entidade e reposit\u00f3rio de gerenciamento de livros<\/a><\/li>\n<li><a href=\"#the-main-spring-boot-application\">O principal <code>Inicializa\u00e7\u00e3o do Spring<\/code> Aplicativo<\/a><\/li>\n<li><a href=\"#adding-caching-capabilities\">Adi\u00e7\u00e3o de recursos de cache<\/a><\/li>\n<li><a href=\"#activate-caching-in-simplebookrepository\">Ativar o cache em <code>SimpleBookRepository<\/code><\/a><\/li>\n<li><a href=\"#seeing-the-data-in-couchbase\">Como ver os dados no Couchbase<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#conclusion\">Conclus\u00e3o<\/a><br \/>\n<!-- \/TOC --><\/li>\n<\/ul>\n<h2 id=\"a-word-of-introduction\">Uma palavra de apresenta\u00e7\u00e3o<\/h2>\n<p>Houve muito trabalho relacionado a <code>Primavera<\/code> ultimamente! Temos estado ocupados trabalhando no <code><a href=\"https:\/\/docs.couchbase.com\/sdk-extensions\/spring-data-couchbase.html\">Dados do Spring Couchbase<\/a><\/code> para atualiz\u00e1-lo para a gera\u00e7\u00e3o 2.x do Java SDK, trazendo consigo <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/spring-data-couchbase-2.0-preview\/\" target=\"_blank\" rel=\"noopener noreferrer\">uma s\u00e9rie de novos recursos e aprimoramentos<\/a> (mas falaremos mais sobre isso em uma postagem posterior no blog)...<\/p>\n<p>Ao longo do caminho, percebemos que h\u00e1 algumas classes no projeto que n\u00e3o est\u00e3o realmente relacionadas diretamente a <code>Dados do Spring<\/code> e, como tal, n\u00e3o precisou aderir ao seu ciclo formal de lan\u00e7amento \"Release Train\": <strong>o <code>cache<\/code> pacote<\/strong>.<\/p>\n<p>Portanto, iniciamos um novo projeto de exemplo simples do Spring Boot Cache para hospedar <strong>o <code>2.x<\/code> gera\u00e7\u00e3o do <code>Couchbase Spring Cache<\/code> implementa\u00e7\u00e3o<\/strong> no 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>Vamos dar uma olhada em como ele pode ser aproveitado para introduzir facilmente o cache com base no Couchbase em um projeto Spring!<\/p>\n<h2 id=\"the-cache-abstraction\">O <code>Cache<\/code> Abstra\u00e7\u00e3o<\/h2>\n<p>O Spring Framework vem com uma abstra\u00e7\u00e3o leve de um <code>Cache<\/code> que os desenvolvedores podem usar automaticamente ao anotar m\u00e9todos em suas classes (por exemplo, em um <code>@Reposit\u00f3rio<\/code> estere\u00f3tipo).<\/p>\n<p>Para usar os mecanismos de cache de inicializa\u00e7\u00e3o do Spring, basta anotar seus m\u00e9todos com um punhado de anota\u00e7\u00f5es relacionadas ao cache:<\/p>\n<ul>\n<li><code>@Cacheable<\/code> permitir\u00e1 que a primeira invoca\u00e7\u00e3o do m\u00e9todo anotado com um determinado conjunto de par\u00e2metros de entrada seja executada, mas o resultado ser\u00e1 armazenado em cache e as invoca\u00e7\u00f5es subsequentes (com o mesmo conjunto) ser\u00e3o atendidas de forma transparente a partir do cache.<\/li>\n<li><code>@CachePut<\/code> sempre invocar\u00e1 o m\u00e9todo e armazenar\u00e1 em cache seu resultado (ao contr\u00e1rio de <code>@Cacheable<\/code> n\u00e3o otimiza o fluxo de invoca\u00e7\u00e3o).<\/li>\n<li><code>@CacheEvict<\/code> calcular\u00e1 uma chave de cache a partir dos par\u00e2metros do m\u00e9todo anotado e a remover\u00e1 do cache quando o m\u00e9todo for executado (por exemplo, porque a invoca\u00e7\u00e3o desse m\u00e9todo torna uma entrada obsoleta).<\/li>\n<li><code>@Caching<\/code> permite reagrupar o comportamento da anota\u00e7\u00e3o anterior em uma \u00fanica anota\u00e7\u00e3o.<\/li>\n<li><code>@CacheConfig<\/code> permite que tenhamos par\u00e2metros de cache comuns definidos em uma classe inteira.<\/li>\n<\/ul>\n<h2 id=\"the-couchbase-implementation\">A implementa\u00e7\u00e3o do Couchbase<\/h2>\n<p>O mecanismo abstrato \u00e9 implementado pela estrutura, mas \u00e9 necess\u00e1rio escolher uma implementa\u00e7\u00e3o de apoio real. O Spring vem com alguns deles (na mem\u00f3ria <code>Mapa<\/code>, <code>EhCache<\/code>, <code>Gemfire<\/code>...), mas \u00e9 absolutamente poss\u00edvel definir personalizados, <strong>simplesmente implementando um <code>Cache<\/code> e um <code>Gerenciador de cache<\/code> e torn\u00e1-lo vis\u00edvel no contexto do Spring<\/strong>.<\/p>\n<p>Esse \u00e9 o foco de <code>couchbase-spring-cache<\/code>.<\/p>\n<p>Cada cache tem um nome, e cada valor no cache tem uma chave de cache. A implementa\u00e7\u00e3o do Couchbase traduzir\u00e1 isso em uma chave de documento que reflete esse...<\/p>\n<ul>\n<li>este \u00e9 um <code>Cache<\/code> documento relacionado (por padr\u00e3o, usando o prefixo \"<code>cache:<\/code>&#8220;)<\/li>\n<li>est\u00e1 relacionado a um determinado <code>Cache<\/code> (adicionando o <code>NOME DO CACHE<\/code> para o prefixo acima)<\/li>\n<li>ele armazena um determinado valor de cache em <code>CACHE_KEY<\/code> (portanto, no final das contas \"<strong><code>cache:CACHE_NAME:CACHE_KEY<\/code><\/strong>&#8220;).<\/li>\n<\/ul>\n<p>Por enquanto, os valores devem ser <code>Serializ\u00e1vel<\/code> e s\u00e3o armazenados como um <code>Documento serializ\u00e1vel<\/code> do <code>2.x<\/code> Java SDK, mas a transcodifica\u00e7\u00e3o alternativa poder\u00e1 ser oferecida no futuro, por exemplo. <code>JSON<\/code>\/<code>JsonDocument<\/code>&#8230;<\/p>\n<h2 id=\"getting-couchbase-spring-cache-and-putting-it-to-work\">Obtendo <code>couchbase-spring-cache<\/code> e colocando-o em pr\u00e1tica<\/h2>\n<p>Observa\u00e7\u00e3o:<\/p>\n<blockquote><p>No momento em que este texto foi escrito, o projeto estava em <code>1.0-SNAPSHOT<\/code> portanto, n\u00e3o est\u00e1 dispon\u00edvel na vers\u00e3o <code>Central Maven<\/code> ainda. Voc\u00ea ter\u00e1 que compilar manualmente o jar e adicion\u00e1-lo ao seu reposit\u00f3rio Maven local.<\/p><\/blockquote>\n<h2 id=\"downloading-and-building-the-couchbase-spring-cache-project\">Download e cria\u00e7\u00e3o do <code>couchbase-spring-cache<\/code> projeto<\/h2>\n<p>Comece clonando o projeto do 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>Em seguida, crie e instale-o localmente usando o Maven:<\/p>\n<pre class=\"bash\"><code>mvn instala\u00e7\u00e3o limpa<\/code><\/pre>\n<p>Voc\u00ea dever\u00e1 ver uma mensagem de sucesso indicando a vers\u00e3o criada e onde ela foi instalada:<\/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\npara <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\">Iniciando um projeto de tutorial<\/h2>\n<p>Criaremos um projeto de exemplo do Spring Cache usando o Maven e o <code>Inicializa\u00e7\u00e3o do Spring<\/code> como base.<br \/>\nComece criando a seguinte estrutura de diret\u00f3rios para o projeto em um diret\u00f3rio raiz de sua escolha (usaremos <code>cbcache<\/code> aqui):<\/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 exemplo, use o seguinte comando:<\/p>\n<pre class=\"bash\"><code>mkdir -p cbcache\/src\/main\/java\/com\/couchbase\/demo\/\r\ncd cbcache<\/code><\/pre>\n<p>Em seguida, inicie o POM na raiz do cbcache em <code>pom.xml<\/code> com o seguinte conte\u00fado:<\/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\">Adicionar entidade e reposit\u00f3rio de gerenciamento de livros<\/h2>\n<p>Usaremos o exemplo de um <code>Livro<\/code> (conforme encontrado no reposit\u00f3rio \"<a href=\"https:\/\/spring.io\/guides\/gs\/caching\/\">COME\u00c7ANDO - Armazenamento de dados em cache com o Spring<\/a>\" guia oficial do Spring.io).<\/p>\n<p>Criar o <code>Livro<\/code> classe de entidade em <code>src\/main\/java\/com\/couchbase\/demo\/Book.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>Observe o <code>Livro<\/code> classe \u00e9 <code>Serializ\u00e1vel<\/code>Por enquanto, isso \u00e9 importante para o armazenamento do Couchbase.<\/p><\/blockquote>\n<p>Crie uma interface de reposit\u00f3rio simples e uma implementa\u00e7\u00e3o ing\u00eanua que simule um atraso:<\/p>\n<p>em <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>em <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\">O principal <code>Inicializa\u00e7\u00e3o do Spring<\/code> Aplicativo<\/h2>\n<p>Por fim, crie um aplicativo que use o reposit\u00f3rio em <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>Se voc\u00ea executar o <code>Aplicativo<\/code>'s <code>principal<\/code> em seu IDE (ou se voc\u00ea invocar o m\u00e9todo \"<code>mvn spring-boot:run<\/code>\" na linha de comando), voc\u00ea perceber\u00e1 que todas as chamadas s\u00e3o de fato muito 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\">Adi\u00e7\u00e3o de recursos de cache do Spring Boot<\/h2>\n<p>Para ativar o armazenamento em cache, voc\u00ea deve seguir algumas etapas: primeiro, voc\u00ea deve oferecer ao Spring um <code>Gerenciador de cache<\/code> <code>@Bean<\/code>&#8230;<\/p>\n<p>Como estaremos usando o <code>CouchbaseCacheManager<\/code> (\u00e9 claro), precisaremos nos conectar a um <code>Aglomerado<\/code> e usar um <code>Balde<\/code> (a unidade de armazenamento onde o couchbase armazenar\u00e1 os documentos do cache).<br \/>\nPortanto, o <code>CouchbaseCacheManager<\/code> precisa de um mapeamento entre <code>Cache<\/code> e os correspondentes nomes <code>Balde<\/code> para usar, passado como um <code>Mapa<\/code>.<\/p>\n<p>Em <code>src\/main\/java\/com\/couchbase\/demo\/Application.java<\/code>adicione as seguintes declara\u00e7\u00f5es 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>Em seguida, voc\u00ea deseja ativar a varredura de anota\u00e7\u00f5es relacionadas ao cache e o proxy associado, colocando a op\u00e7\u00e3o <code>@EnableCaching<\/code> na anota\u00e7\u00e3o <code>Aplicativo<\/code> classe.<\/p>\n<h2 id=\"activate-caching-in-simplebookrepository\">Ativar o cache em <code>SimpleBookRepository<\/code><\/h2>\n<p>Vamos ver como ativar o cache real em nosso <code>SimpleBookRepository<\/code> e verifique como o aplicativo se comporta depois disso.<\/p>\n<p>Para fazer <code>getByIsbn<\/code> automaticamente no cache na primeira chamada e servir as chamadas subsequentes com dados do cache, basta anot\u00e1-lo dessa forma:<\/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 executar o aplicativo novamente e ver como ele se comporta agora:<\/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>Uau! Isso \u00e9 muito melhor para invoca\u00e7\u00f5es ap\u00f3s a primeira, parece que est\u00e1 de fato em cache :-)<\/p>\n<h2 id=\"seeing-the-data-in-couchbase\">Como ver os dados no Couchbase<\/h2>\n<p>Vamos dar uma olhada r\u00e1pida no console da Web para verificar se esses \u00f3timos tempos podem ser atribu\u00eddos ao Couchbase:<\/p>\n<ul>\n<li>abra uma nova guia em seu navegador e navegue at\u00e9 <a href=\"https:\/\/localhost:8091\"><code>https:\/\/localhost:8091<\/code><\/a>.<\/li>\n<li>Conecte-se ao console da Web.<\/li>\n<li>ir para o <code>Compartimentos de dados<\/code> e clique na guia <code>Documentos<\/code> para o balde que voc\u00ea escolheu usar (\"padr\u00e3o\").<\/li>\n<\/ul>\n<p>O que voc\u00ea v\u00ea nessa tela (<a href=\"https:\/\/localhost:8091\/index.html#sec=documents&amp;viewsBucket=default\">link r\u00e1pido<\/a> para os pregui\u00e7osos) deve ser semelhante a este:<\/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 os livros foram armazenados em cache no couchbase, usando o <strong><code>cache:CACHE_NAME:CACHE_KEY<\/code><\/strong> para os IDs de documentos.<\/p>\n<h2 id=\"conclusion\">Conclus\u00e3o<\/h2>\n<p>O armazenamento em cache f\u00e1cil usando o Couchbase agora est\u00e1 ao seu alcance!<\/p>\n<p>H\u00e1 muito mais que <code>Spring Cache<\/code> pode fazer por voc\u00ea (por exemplo, escolher como criar a chave de cache, cache condicional, despejo de cache, etc.), e h\u00e1 especificidades para <code>couchbase-spring-cache<\/code> (por exemplo, para a limpeza do cache, voc\u00ea pode escolher entre usar uma exibi\u00e7\u00e3o que remover\u00e1 apenas o documento relevante ou, se o seu bucket for dedicado a um \u00fanico cache, use o <code>descarga<\/code> mecanismo...).<\/p>\n<p>Espero que este tutorial introdut\u00f3rio tenha despertado seu apetite para usar o cache facilmente usando <code>Spring Cache<\/code> e <code>Couchbase<\/code>!<\/p>\n<p>As pr\u00f3ximas etapas provavelmente ser\u00e3o a introdu\u00e7\u00e3o de formatos de armazenamento alternativos (como JSON) e a oferta do artefato no Maven Central ou em um reposit\u00f3rio Maven semelhante publicamente acess\u00edvel (<a href=\"https:\/\/bintray.com\">Bintray<\/a> algu\u00e9m?)...<\/p>\n<p>Fique atento \u00e0s not\u00edcias relacionadas \u00e0 primavera em um futuro pr\u00f3ximo!<\/p>\n<p>Enquanto isso, boa codifica\u00e7\u00e3o :)<\/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.9 (Yoast SEO v25.9) - 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\/pt\/couchbase-spring-cache\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"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\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\/pt\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cache Data with Spring Cache and Couchbase as Backing Store","description":"Saiba como armazenar dados em cache utilizando o Spring Cache e o Couchbase como armazenamento de backup. O armazenamento em cache f\u00e1cil usando o Couchbase est\u00e1 agora ao seu alcance!","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\/couchbase-spring-cache\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"Saiba como armazenar dados em cache utilizando o Spring Cache e o Couchbase como armazenamento de backup. O armazenamento em cache f\u00e1cil usando o Couchbase est\u00e1 agora ao seu alcance!","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-spring-cache\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"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\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, engenheiro de software, Pivotal","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com.","url":"https:\/\/www.couchbase.com\/blog\/pt\/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_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2039","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\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2039"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2039\/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=2039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2039"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}