mirror of
https://github.com/foomo/foomo-docs.git
synced 2025-10-16 12:35:40 +00:00
56 lines
26 KiB
HTML
56 lines
26 KiB
HTML
<!doctype html>
|
||
<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-projects/cms/gocontentful/caching">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="generator" content="Docusaurus v2.4.0">
|
||
<title data-rh="true">Caching | foomo project docs</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://www.foomo.org/docs/projects/cms/gocontentful/caching"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Caching | foomo project docs"><meta data-rh="true" name="description" content="Caching is a fundamental part of working with remote data across the Internet,"><meta data-rh="true" property="og:description" content="Caching is a fundamental part of working with remote data across the Internet,"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://www.foomo.org/docs/projects/cms/gocontentful/caching"><link data-rh="true" rel="alternate" href="https://www.foomo.org/docs/projects/cms/gocontentful/caching" hreflang="en"><link data-rh="true" rel="alternate" href="https://www.foomo.org/docs/projects/cms/gocontentful/caching" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://SUATUVZDDM-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="foomo project docs RSS Feed">
|
||
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="foomo project docs Atom Feed">
|
||
|
||
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml" title="foomo project docs" href="/opensearch.xml"><link rel="stylesheet" href="/assets/css/styles.45fe17b6.css">
|
||
<link rel="preload" href="/assets/js/runtime~main.339c949d.js" as="script">
|
||
<link rel="preload" href="/assets/js/main.4cf1833b.js" as="script">
|
||
</head>
|
||
<body class="navigation-with-keyboard">
|
||
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
|
||
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><b class="navbar__title text--truncate">foomo</b></a><a class="navbar__item navbar__link" href="/docs/general">General</a><a class="navbar__item navbar__link" href="/docs/frontend">Frontend</a><a class="navbar__item navbar__link" href="/docs/backend">Backend</a><a class="navbar__item navbar__link" href="/docs/devops">DevOps</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/projects">Projects</a></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/blog">Blog</a><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/projects">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/projects/architecture">Architecture</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/docs/projects/cms">CMS</a><button aria-label="Toggle the collapsible sidebar category 'CMS'" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/projects/cms/contentserver">contentserver</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/projects/cms/contentful">contentful</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="/docs/projects/cms/gocontentful">Gocontentful</a><button aria-label="Toggle the collapsible sidebar category 'Gocontentful'" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/projects/cms/gocontentful/getting-started">Getting started</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/projects/cms/gocontentful/test-api">Play with the test API</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/projects/cms/gocontentful/working-with-gocontentful-api">Working with the Gocontentful API</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/projects/cms/gocontentful/caching">Caching</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/projects/cms/gocontentful/api-reference">API Reference</a></li></ul></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/projects/gograpple">gograpple</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/projects/gotsrpc">gotsrpc</a><button aria-label="Toggle the collapsible sidebar category 'gotsrpc'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/projects/libraries/keel-circuit-breaker">libraries</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/projects/pagespeed-exporter">pagespeed exporter</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/projects/webgrapple">webgrapple</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/projects/cms"><span itemprop="name">CMS</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/projects/cms/gocontentful"><span itemprop="name">Gocontentful</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Caching</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>Caching</h1><p>Caching is a fundamental part of working with remote data across the Internet,
|
||
where access is severely impacted by latency and transfer time. In real-world scenarios,
|
||
you'll always need to keep all the data you need close and sync the changes with the remote
|
||
CMS when they happen. </p><p>Gocontentful supports caching out of the box. The client can maintain a cache of an entire space
|
||
or a subset of the content types that can be initialized with a single method call:</p><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">contentTypes </span><span class="token operator" style="color:rgb(137, 221, 255)">:=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"person"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"pet"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">err </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> cc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">UpdateCache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> contentTypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This makes sense for client modes <code>ClientModeCDA</code> and <code>ClientModeCPA</code> and not for the management API.
|
||
The client will download all the entries, convert and store them in the case as
|
||
native Go value objects. This makes subsequent accesses to the space data an in-memory operation removing all the HTTP
|
||
overhead.</p><p>The first parameter is the context. If you don't use a context in your application or service just pass <em>context.Background()</em></p><p>The third parameter of UpdateCache toggles asset caching on or off. If you deal with assets you want this to be always on.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="full-cache-init-and-rebuild">Full cache init and rebuild<a href="#full-cache-init-and-rebuild" class="hash-link" aria-label="Direct link to Full cache init and rebuild" title="Direct link to Full cache init and rebuild"></a></h4><p>By default the client will cache the whole space using 4 parallel workers to speed up the process.
|
||
This is safe since Contentful allows up to 5 concurrent connections.
|
||
If you have content types that have a lot of entries, it might make sense to keep them close to each other
|
||
in the content types slice passed to UpdateCache(), so that they will run in parallel and not one after the other.</p><p>All gocontentful functions that query the space cache-transparent: if a cache is available data will be loaded from
|
||
there, otherwise it will be sourced from Contentful. This doesn't apply to <em>GetFilteredXYZ()</em> calls that
|
||
always need to pass the query to Contentful. </p><p>Gocontentful also supports selective entry and asset cache updates through the following method:</p><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">err </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> cc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">UpdateCacheForEntity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> sysType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> contentType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> entityID </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>When something changes in the space at Contentful you need to update the cache. For this to happen you need to set
|
||
up a webhook at Contentful and handle its calls in your service through a public HTTP listener.
|
||
When a webhook call gets in, you have the choice of updating your cache in different ways:</p><ul><li>You can regenerate the entire CDA cache when something is published because you want production data to
|
||
be 100% up to date in your application. This can get slow and expensive.</li><li>You can alternatively update a single entry in the cache. This is usually the case for the CPA cache because
|
||
it's a lot faster and that works well for preview features.</li><li>You can use the Sync API, but only limited to <code>ClientModeCDA</code>, as explained in the following paragraph.</li></ul><p>In any case, if an update fails the previous cache is preserved to prevent service disruption.
|
||
In the unfortunate case a service or application needs to start and Contentful is not available, Gocontentful can work
|
||
in an offline mode if you call <em>SetOfflineFallback</em> on the client after you create it passing the path to a space export file.</p><p>The gocontentful API can work entirely offline too. In this case a cache is created from a space export file and most of the
|
||
features are available (pretty obviously, those that don't require live access to the space, like custom queries). If you update
|
||
the export file periodically you can even update the cache from the updated file.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="sync-api-support">Sync API support<a href="#sync-api-support" class="hash-link" aria-label="Direct link to Sync API support" title="Direct link to Sync API support"></a></h4><p>In versions v1.0.12 and newer, gocontentful supports the Contentful Sync API and that's now the recommended way to cache spaces and manage updates.
|
||
Sync is enabled by default when you create a client with CDA mode.
|
||
To enable or disable support for the Sync API explicitly, you can call the SetSyncMode method on the client:</p><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">cc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">SetSyncMode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>With sync on, the cache updates will happen transparently through downloads of incremental changes.
|
||
The syntax to update the cache doesn't change, just call <em>UpdateCache</em> on the client as usual.</p><p>The initialization of the cache will be slower when <em>SyncMode</em> is on compared to the legacy full cache init because sync calls cannot be parallelized.
|
||
Subsequent updates though will be much faster because only changes in the space from the previous sync will be downloaded.
|
||
This includes entries and assets that were deleted. In case of need you can call <em>ResetSync()</em> to start over from a fresh empty cache.</p><p>Note that the Sync API is not officially supported by Contentful on the Preview API. At the time of this writing it seems to work but use it at your own risk.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="cache-timeout">Cache timeout<a href="#cache-timeout" class="hash-link" aria-label="Direct link to Cache timeout" title="Direct link to Cache timeout"></a></h3><p>Cache update operations time out by default after 120 seconds. This makes sure that no
|
||
routine is left hanging, blocking subsequent updates in case the main application or service
|
||
recovers from a panic. If you need to increase this limit because you have a huge space with
|
||
a lot of entries you can use the <em>SetCacheUpdateTimeout</em> method. See the <a href="/docs/projects/cms/gocontentful/api-reference">API Reference</a> for details.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="asset-caching">Asset caching<a href="#asset-caching" class="hash-link" aria-label="Direct link to Asset caching" title="Direct link to Asset caching"></a></h3><p>If you use assets in your space, then you absolutely need to enable them in the <em>UpdateCache</em> call.
|
||
Otherwise, every time an entry needs to resolve a reference to an asset that single asset will be downloaded
|
||
and that for large spaces with thousands of assets can lead to incredibly slow operation.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="when-to-use-and-not-use-caching">When to use and not use caching<a href="#when-to-use-and-not-use-caching" class="hash-link" aria-label="Direct link to When to use and not use caching" title="Direct link to When to use and not use caching"></a></h3><p>Simple answer is: you should almost always use caching. The only scenario where not using
|
||
a cache on the client is better is when you only need to download a very limited amount
|
||
of entries (in the order of less than some hundreds) and do that at significant distance in time
|
||
(e.g. every hour). In this case your application code can be simpler and there won't be any
|
||
performance penalty. The other case is when you need to run a lot of custom queries or
|
||
use XPath, which is currently not supported by gocontentful directly.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/foomo/foomo-docs/tree/main/foomo/docs/projects/cms/gocontentful/05-caching.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/projects/cms/gocontentful/working-with-gocontentful-api"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Working with the Gocontentful API</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/projects/cms/gocontentful/api-reference"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">API Reference</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#cache-timeout" class="table-of-contents__link toc-highlight">Cache timeout</a></li><li><a href="#asset-caching" class="table-of-contents__link toc-highlight">Asset caching</a></li><li><a href="#when-to-use-and-not-use-caching" class="table-of-contents__link toc-highlight">When to use and not use caching</a></li></ul></div></div></div></div></main></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">github</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foomo" target="_blank" rel="noopener noreferrer" class="footer__link-item">https://github.com/foomo</a></li></ul></div><div class="col footer__col"><div class="footer__title">legal</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/etc/imprint">Imprint</a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">© 2023 bestbytes</div></div></div></footer></div>
|
||
<script src="/assets/js/runtime~main.339c949d.js"></script>
|
||
<script src="/assets/js/main.4cf1833b.js"></script>
|
||
</body>
|
||
</html> |