DEV Community

Andrew Welch
Andrew Welch

Posted on • Originally published at nystudio107.com on

1

The Craft {% cache %} Tag In-Depth

The Craft {% cache %} Tag In-Depth

Craft CMS has a {% cache %} tag that can help with per­for­mance, if used effec­tive­ly. Here’s how it works.

Andrew Welch / nystudio107

Craft Cms Cache Tag

Update: This arti­cle has been updat­ed to cov­er both Craft CMS 2.x and Craft CMS 3.x

The {% cache %} tag avail­able in Craft CMS can help with per­for­mance, if you under­stand it and apply it cor­rect­ly. How­ev­er, as so elo­quent­ly stat­ed on the Craft CMS Tem­plat­ing Docs page:

In oth­er words, the {% cache %} tag is not some­thing you should use to mask per­for­mance prob­lems, be they from an ane­mic or poor­ly con­fig­ured serv­er, or tem­plates that are writ­ten inef­fi­cient­ly. You can’t just write hor­ri­bly inef­fi­cient tem­plates, slap them up on GoDad­dy shared host­ing, and expect to ​“solve” the per­for­mance prob­lems with the {% cache %} tag. We call that putting lip­stick on a pig.

How­ev­er, it can be an extreme­ly use­ful tool once you under­stand what it is, and how to uti­lize it.

Why Do We Cache?

The gen­er­al idea behind a cache is that we want to keep data that we access fre­quent­ly around in a for­mat that can quick­ly be retrieved. We do this in our dai­ly lives, too. When you wake up in the morn­ing and open up the med­i­cine cab­i­net, every­thing you need to get ready is right there wait­ing for you.

Imag­ine how much time it would take you to get ready in the morn­ing if your toi­letries were scat­tered all over your house, and you had to hunt for them every morning…

We are pre­flight­ing our morn­ing rou­tine by caching the stuff we need all in one place, so we can get our job of get­ting ready done efficiently.

And that’s exact­ly why we cache data on our com­put­ers as well. Rather than com­pute some insane­ly com­pli­cat­ed for­mu­la pulled from a mas­sive dataset each time a web­page is loaded, we can cache it. We cal­cu­late the result at a non-crit­i­cal time, and present this cached result to the user when they load the page.

Every­one’s happy.

What Exact­ly Does the {% cache %} Tag Do?

So now that we under­stand why we want to cache data, let’s have a look at exact­ly how the {% cache %} tag in Craft CMS works. Here’s a pret­ty stan­dard chunk of Twig code:


{% for entry in craft.entries.section('blog').relatedTo(someCategory) %}
    <article>
        <h1>{{ entry.title }}</h1>
        <p>{{ entry.summary }}</p>
        <img src="{{ entry.image.first().getUrl(myTransform) }}">
    </article>
{% endfor %}

This code gen­er­ates a num­ber of data­base queries to pull in all of our blog entries that are relat­ed to someCategory and then loops through and dis­plays them. The {{ entry.image.first().getUrl(myTransform) }} actu­al­ly gen­er­ates sev­er­al data­base queries each time through the loop, because Assets are rela­tions that need to be looked up, and it has to look up the Asset trans­form. This is called the N+1 query prob­lem, and it basi­cal­ly just means that the more entries we have, the slow­er things are gonna get.

Do we real­ly need to do all of these data­base queries every time some­one loads our web page? Nope. We only post a new blog entry once a week at best; there’s no rea­son to do all of these data­base queries every sin­gle time a page is loaded.

So instead, we can wrap it in a {% cache %} tag:


{% cache %}
    {% for entry in craft.entries.section('blog').relatedTo(someCategory) %}
        <article>
            <h1>{{ entry.title }}</h1>
            <p>{{ entry.summary }}</p>
            <img src="{{ entry.image.first().getUrl(myTransform) }}">
        </article>
    {% endfor %}
{% endcache %}

All that the {% cache %} tag does is cap­ture the parsed out­put of what­ev­er it’s wrapped around, and stores the result as text in the data­base. So instead of a bunch of queries for our entries, and a num­ber of queries for our entry.image.first().getUrl(myTransform) each time through the loop, we only end up with one query for our cached result.

This is why we want to use {% cache %} tags around blocks of Twig code that are either com­pute-inten­sive, or blocks of Twig code that gen­er­ate a large num­ber of data­base queries. If you just wrap plain old HTML text in {% cache %} tags, you won’t see any gains. It might even be ever so slight­ly slow­er, because we’ve added a data­base query where before there was none.

Tan­gent: Astute read­ers will note that the above exam­ple is a per­fect can­di­date for Eager Load­ing, but that’s beyond the scope of this article.

If you have devMode enabled, you can view your JavaScript Con­sole to see the num­ber of data­base queries exe­cut­ed on a page. Here’s what it looks like for this blog page you’re read­ing right now, with­out {% cache %} tags:

Caching Off

And here’s what the same blog page looks like with {% cache %} tags judi­cious­ly used:

Caching On

We went from 102 data­base queries down to 43 data­base queries, and the time these queries took went from 1.84s down to just 0.49s! This is a huge gain, for very lit­tle work! And the num­ber of queries for the page with­out {% cache %} tags will keep going up as we add more blog entries, while the num­ber of queries for our cached page will stay con­stant. We have sub­sti­tut­ed many data­base queries for few­er, which results in bet­ter performance.

The key take-away here is that what the {% cache %} tag is doing is stor­ing the parsed out­put of the Twig code that’s inside of it. If you have Twig code such as {{ now|date("M d, Y") }} inside a {% cache %} tag, what’s saved in the cache is not the Twig code, but rather the parsed result (in this case, a date). So the date dis­played on the web­page is not going to change as long as the data is cached.

So if our code is:


{% cache %}
    {{ now|date("M d, Y") }}
{% endcache %}

What’s actu­al­ly saved in the data­base for this cached chunk of Twig code is just:


Nov 30, 2016

Tan­gent: The cacheDuration Gen­er­al Con­fig Set­ting deter­mines how long a tem­plate cache will be kept around. This set­ting defaults to P1D (1 day, or 24 hours), which means that your caches are going to be regen­er­at­ed every 24 hours. While this is a sen­si­ble default set­ting, it is a bit con­ser­v­a­tive, giv­en Craft’s auto­mat­ic cache break­ing. I typ­i­cal­ly set it to cacheDuration => false in my craft/config/general.php file, which means that the tem­plate caches nev­er expire on their own, they only are regen­er­at­ed when con­tent inside the {% cache %} tags changes. For a dis­cus­sion of how to use mul­ti-envi­ron­ment con­fig set­tings, check out the Mul­ti-Envi­ron­ment Con­fig for Craft CMS article.

Cache-Busters!

That brings up an inter­est­ing conun­drum. What hap­pens if some­one changes one of the blog entries that was inside of our {% cache %} tags? Craft is actu­al­ly pret­ty clever about it: it keeps track of any ele­ments (entries, assets, etc.) that are inside of your {% cache %} tags, and will mark the cache as being stale if they have changed. So it will auto­mat­i­cal­ly break the cache for you, caus­ing it to regen­er­ate and re-cache the data.

This is great, but we also have to do our jobs being smart about what we cache, and how we cache it. For exam­ple, a typ­i­cal blog page will have the blog entry itself, as well as a ​“blog archives” sec­tion that lists all of our old­er blog entries.

Now, we could just wrap the entire tem­plate in {% cache %} tags and call it a day. How­ev­er, think about what hap­pens when a new blog is pub­lished: it will inval­i­date every sin­gle blog page cache, because our archives changed with the addi­tion of a new blog post! This seems a bit sil­ly, because our oth­er blogs entries did­n’t change at all. All that changed was our blog archives sec­tion, to list the new blog entry.

If you think about it from an abstract point of view, we real­ly have two enti­ties we want to cache in this case:

  1. The blog entry itself
  2. The blog archives

Because they real­ly are inde­pen­dent of each oth­er. We might add a new blog post that would cause the blog archives to need to change, but this does­n’t affect our each blog entry.

Fur­ther, every sin­gle blog entry page is going to share the same exact blog archives sec­tion. So, we can do some­thing like this:

Craft 2.x Example

This is an exam­ple that cov­ers Craft 2.x specif­i­cal­ly; although most of the code is sim­i­lar for Craft 3.x, the way the default cache key is deter­mined is different.


{# -- Our blog entry -- #}
{% cache globally using key craft.request.path %}
    <article>
        <h1>{{ entry.title }}</h1>
        <p>{{ entry.body }}</p>
        <img src="{{ entry.image.first().getUrl(myTransform) }}">
    </article>
{% endcache %}

{# -- Our blog archives -- #}
{% cache globally using key "blog-archives" %}
    <section>
        {% for blogArchive in craft.entries.section('blog') %}
            <h1>{{ blogArchive.title }}</h1>
            <p>{{ blogArchive.summary }}</p>
        {% endfor %}
    </section>
{% endcache %}

Here we have two sep­a­rate caches on one page. The first is for our actu­al blog entry; the sec­ond is a glob­al­ly cached out­put of our blog archives, stored in the data­base as blog-archives. This means that there is a unique cache of each blog entry, but a sin­gle glob­al­ly shared cache of our blog archives.

Which is great, because we don’t want every sin­gle blog page to have to be re-cached when­ev­er we add a new blog entry. It’ll just re-cache the blog archives cache, which all of our blog pages share.

You’ll also notice that instead of just using the {% cache %} tag on its own, we’re actu­al­ly using {% cache globally using key craft.request.path %}. We do this because the default behav­ior for the {% cache %} tag is to use the full path as a way of unique­ly iden­ti­fy­ing our cache (in addi­tion to a unique hash that Craft auto­mat­i­cal­ly gen­er­ates, so we can have more than one {% cache %} tag per page). This full path includes the query string, which is any­thing after the ? in a URI, e.g.: ?utm_source=GHDJ14J.

But we don’t real­ly want the query string to cause a new, unique cached item, oth­er­wise we could poten­tial­ly end up with hun­dreds or even thou­sands of entries in the craft_templatecaches data­base table. For instance, if we just use the {% cache %} tag on its own, a request to /blog and /blog?utm_source=F1GMAT refer to the same page, but would result in addi­tion­al craft_templatecaches entries.

If you end up with a large num­ber of entries in the craft_templatecaches data­base table, it can actu­al­ly hin­der per­for­mance rather than help it — which defeats the whole point of caching to begin with! Pix­el & Ton­ic is actu­al­ly chang­ing the default behav­ior of the {% cache %} tag in Craft 3 to not include the query string, for this very reason.

If you are using the Retour plu­g­in, and you are imple­ment­ing {% cache %} tags in your _layout.twig that oth­er tem­plates extend, you might con­sid­er using a pat­tern like this:


{% cache globally using key craft.request.path unless craft.retour.getHttpStatus != 200 %}

This will cause it to ignore the query string for the cache key, and also nev­er cache any­thing that’s not a 200 OK http sta­tus code. This is need­ed for prop­er error han­dling as described in the Han­dling Errors Grace­ful­ly in Craft CMS article.

Keep in mind that if you use {% cache globally using key craft.request.path %} you can only have one {% cache %} tag per page, because the unique key will be the craft.request.path. So if you require more than one {% cache %} tag on a page, add a descrip­tive name to the key to make it unique, such as {% cache globally using key "header-block" ~ craft.request.path %}.

Think about what is on your page, and how it might best be to cache it effectively.

Craft 3.x Example

This is an exam­ple that cov­ers Craft 3.x specif­i­cal­ly; although most of the code is sim­i­lar for Craft 2.x, the way the default cache key is deter­mined is different.


{# -- Our blog entry -- #}
{% cache %}
    <article>
        <h1>{{ entry.title }}</h1>
        <p>{{ entry.body }}</p>
        <img src="{{ entry.image.first().getUrl(myTransform) }}">
    </article>
{% endcache %}

{# -- Our blog archives -- #}
{% cache globally using key "blog-archives" %}
    <section>
        {% for blogArchive in craft.entries.section('blog') %}
            <h1>{{ blogArchive.title }}</h1>
            <p>{{ blogArchive.summary }}</p>
        {% endfor %}
    </section>
{% endcache %}

Here we have two sep­a­rate caches on one page. The first is for our actu­al blog entry; the sec­ond is a glob­al­ly cached out­put of our blog archives, stored in the data­base as blog-archives. This means that there is a unique cache of each blog entry, but a sin­gle glob­al­ly shared cache of our blog archives.

Which is great, because we don’t want every sin­gle blog page to have to be re-cached when­ev­er we add a new blog entry. It’ll just re-cache the blog archives cache, which all of our blog pages share.

You’ll also notice that unlike the Craft 2.x exam­ple, we’re just using the {% cache %} tag on its own. Pix­el & Ton­ic changed the default behav­ior of the {% cache %} tag in Craft 3 to not include the query string, so it saves us from hav­ing to do it on our own.

If you are using the Retour plu­g­in for Craft 3, and you are imple­ment­ing {% cache %} tags in your _layout.twig that oth­er tem­plates extend, you might con­sid­er using a pat­tern like this:


{% cache unless craft.retour.getHttpStatus != 200 %}

This will cause it to nev­er cache any­thing that’s not a 200 OK http sta­tus code. This is need­ed for prop­er error han­dling as described in the Han­dling Errors Grace­ful­ly in Craft CMS article.

Think about what is on your page, and how it might best be to cache it effectively.

Cache Exemp­tions

A rea­son­ably com­mon pat­tern is that you want to cache your entire web­page, but there are cer­tain excep­tions that you don’t want cached. Let’s call them cache exemp­tions.

For instance, you might want to cache all of you pages by putting a {% cache %} tag in your main layout.twig file, as men­tioned above. But we don’t want to cache pages with non-200 http sta­tus codes, and maybe we don’t want to cache cer­tain pages like search results pages, and so on.

A nice pat­tern you can use is some­thing like this:

CRAFT 2.x EXAMPLE:


{# ##### Craft 2.x Cache exemption ##### #}
{% set cacheExempt = false %}
{# Exempt certain pages #}
{% set cacheExemptSegments = [
    'dont-cache-me-bro',
] %}
{% if craft.request.getSegment(1) in cacheExemptSegments %}
    {% set cacheExempt = true %}
{% endif %}
{# Also exempt pages with non-200 OK status codes #}
{% if craft.retour.getHttpStatus != 200 %}
    {% set cacheExempt = true %}
{% endif %}
{# Add any cache exemption conditions #}
...

{% cache globally using key craft.request.path unless cacheExempt %}

CRAFT 3.x EXAMPLE:


{# ##### Craft 3.x Cache exemption ##### #}
{% set cacheExempt = false %}
{# Exempt certain pages #}
{% set cacheExemptSegments = [
    'dont-cache-me-bro',
] %}
{% if craft.app.request.getSegment(1) in cacheExemptSegments %}
    {% set cacheExempt = true %}
{% endif %}
{# Also exempt pages with non-200 OK status codes #}
{% if craft.retour.getHttpStatus != 200 %}
    {% set cacheExempt = true %}
{% endif %}
{# Add any cache exemption conditions #}
...

{% cache unless cacheExempt %}

Using this tech­nique, you can add as many pages as you like to the cacheExemptSegments array, and any request that match­es the first seg­ment won’t be cached. You can leave this code in with an emp­ty array to have it not exempt any pages by first seg­ment, to future-proof things in case you need to down the road.

You can then add any oth­er con­di­tions you might have, which makes this pat­tern exten­si­ble, and it also keeps your actu­al {% cache %} tag fair­ly clean.

A Peek Under the Hood

So let’s get down and dirty, and have a look at what the entries in the craft_templatecaches table actu­al­ly look like. Here’s the table schema for the craft_templatecaches table:


MariaDB [nystudio]> describe craft_templatecaches;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| cacheKey | varchar(255) | NO | | NULL | |
| locale | char(12) | NO | MUL | NULL | |
| path | varchar(255) | YES | | NULL | |
| expiryDate | datetime | NO | | NULL | |
| body | mediumtext | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

The cache entries are sen­si­bly done on a per-locale basis, and have a cacheKey and a path that unique­ly iden­ti­fy them. If we just use the reg­u­lar old {% cache %} tag for our pages, the data­base entries in the table might look some­thing like this:


MariaDB [nystudio]> select cacheKey,path from craft_templatecaches;
+--------------------------------------+--------------------------------------------------+
| cacheKey | path |
+--------------------------------------+--------------------------------------------------+
| blog-archives | NULL |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog/creating-optimized-images-in-craft-cms |
+--------------------------------------+--------------------------------------------------+

As you can see, Craft stores both a cacheKey and a path for each entry. These two in com­bi­na­tion are what describe a unique entry in the craft_templatecaches table. The cacheKey is what we asked it to be for our glob­al blog-archives, and is a ran­dom hash for places where we just used the reg­u­lar old {% cache %} tag.

If we instead use the {% cache globally using key craft.request.path %} pat­tern, our craft_templatecaches ends up look­ing like this:


MariaDB [nystudio]> select cacheKey,path from craft_templatecaches;
+---------------------------------------------+----------------+
| cacheKey | path |
+---------------------------------------------+----------------+
| blog-archives | NULL |
| blog | NULL |
| blog/creating-optimized-images-in-craft-cms | NULL |
+---------------------------------------------+----------------+

As you can see, it’s using the craft.request.path for the key, and there’s noth­ing stored in the path. If we don’t strip the query string out on Craft 2.x (this won’t be an issue on Craft 3.x) via {% cache globally using key craft.request.path %}, we could end up with a craft_templatecaches table that looks like this:


MariaDB [nystudio]> select cacheKey,path from craft_templatecaches;
+--------------------------------------+--------------------------------------------------+
| cacheKey | path |
+--------------------------------------+--------------------------------------------------+
| blog-archives | NULL |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog?utm_source=F1GMAT |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog?utm_source=ADG12F |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog?utm_source=GS13FA |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog?utm_source=SM66MS |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog?utm_source=CMBKA4 |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog?utm_source=HGHAJ2 |
| yYNGYDNbbsxeRCDCWhBqbmpHbN2NBELomimv | site:blog?utm_source=24GSJ2 |
+--------------------------------------+--------------------------------------------------+

And on and on. We can end up with a ton of entries in the craft_templatecaches table that are real­ly the same thing, which can result in per­for­mance degra­da­tion, and the dread­ed hung Delet­ing Stale Tem­plate Caches task.

The same is true for the case where we {% cache %} things in our _layout.twig file, and our 404 tem­plate extends that _layout.twig: if we don’t exclude 404 Not Found http sta­tus codes, we’ll end up with a craft_templatecaches entry for every sin­gle 404 that hits our site. Every. Sin­gle. One.

And believe me, there are swarms of bots out there on the Inter­net that probe your web­sites every day look­ing for vul­ner­a­bil­i­ties that will gen­er­ate a mas­sive num­ber of 404 errors, and can cause seri­ous per­for­mance impli­ca­tions for your website.

So cache wisely.

But wait, there’s more!

We can go even fur­ther down the rab­bit hole. In addi­tion to the templatecaches table, Craft keeps track of some addi­tion­al infor­ma­tion for each cache entry.

But Wait Theres More

To help with the auto­mat­ic cache break­ing, Craft also has a table called templatecacheelements that keeps track of any Ele­ments (Entries, Catagories, Assets, etc.) that are inside of a giv­en {% cache %} tag:


MariaDB [craft3]> select * from templatecacheelements;
+---------+-----------+
| cacheId | elementId |
+---------+-----------+
| 1 | 4 |
| 2 | 85 |
| 2 | 80 |
| 2 | 81 |
| 2 | 73 |
| 2 | 74 |
| 2 | 4 |
| 2 | 83 |
+---------+-----------+
8 rows in set (0.00 sec)

Note that there is a row for each templatecaches id. This is so that if an ele­ment inside of a {% cache %} tag is changed, Craft can automag­i­cal­ly break the cache. But note that it also means that if we have a whole lot of ele­ments inside of our {% cache %} tags, we can end up with a whole lot of rows in this table:


MariaDB [imawhale]> select * from craft_templatecacheelements;
+---------+-----------+
| cacheId | elementId |
+---------+-----------+
| 12160 | 2 |
| 12160 | 369 |
| 12160 | 370 |
| 12160 | 55 |
| 12160 | 57 |
| 12160 | 58 |
| 12160 | 56 |
| 12160 | 59 |
| 12160 | 297 |
| 12160 | 233 |
...
24647 rows in set (0.03 sec)

So if we have a web­site with 10,000 blog entries on it, and each blog has 10 ele­ments inside of the {% cache %} tag, that means we’ll end up with 10,000 rows in the templatecaches table, and 100,000 rows in the templatecacheelements table. For the blog alone.

Sim­i­lar­ly, there’s anoth­er table that Craft uses to keep track of Ele­ment Cri­te­ria (templatecachecriteria) for Craft 2.x, and Ele­ment Queries (templatecachequeries) for Craft 3.x.

CRAFT 2.x ELE­MENT CRITERIA:


MariaDB [imawhale]> select * from craft_templatecachecriteria;
+--------+---------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | cacheId | type | criteria |
+--------+---------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 113997 | 12160 | Entry | {"ancestorDist":null,"ancestorOf":null,"archived":0,"dateCreated":null,"dateUpdated":null,"descendantDist":null,"descendantOf":null,"fixedOrder":0,"id":null,"indexBy":null,"level":null,"limit":100,"locale":"en","localeEnabled":1,"nextSiblingOf":null,"offset":0,"order":"lft, postDate desc","positionedAfter":null,"positionedBefore":null,"prevSiblingOf":null,"relatedTo":null,"ref":null,"search":null,"siblingOf":null,"slug":"twitch-nav","status":"live","title":null,"uri":null,"with":null,"childField":null,"childOf":null,"depth":null,"parentField":null,"parentOf":null,"after":null,"authorGroup":null,"authorGroupId":null,"authorId":null,"before":null,"editable":0,"expiryDate":null,"postDate":null,"section":"navigation","sectionId":null,"type":null} |
| 113998 | 12160 | MatrixBlock | {"ancestorDist":null,"ancestorOf":null,"archived":0,"dateCreated":null,"dateUpdated":null,"descendantDist":null,"descendantOf":null,"fixedOrder":0,"id":null,"indexBy":null,"level":null,"limit":100,"locale":"en","localeEnabled":1,"nextSiblingOf":null,"offset":0,"order":"matrixblocks.sortOrder","positionedAfter":null,"positionedBefore":null,"prevSiblingOf":null,"relatedTo":null,"ref":null,"search":null,"siblingOf":null,"slug":null,"status":"enabled","title":null,"uri":null,"with":null,"childField":null,"childOf":null,"depth":null,"parentField":null,"parentOf":null,"fieldId":"28","ownerId":"369","ownerLocale":null,"type":null} |
...
22745 rows in set (0.04 sec)

CRAFT 3.x ELE­MENT QUERIES:


MariaDB [craft3]> select * from templatecachequeries;
+----+---------+----------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | cacheId | type | query |
+----+---------+----------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | 2 | craft\elements\Entry | TzoyODoiY3JhZnRcZWxlbWVudHNcZGJcRW50cnlRdWVyeSI6NzA6e3M6ODoiZWRpdGFibGUiO2I6MDtzOjk6InNlY3Rpb25JZCI7YToxOntpOjA7czoxOiIzIjt9czo2OiJ0eXBlSWQiO047czo4OiJhdXRob3JJZCI7TjtzOjEzOiJhdXRob3JHcm91cElkIjtOO3M6ODoicG9zdERhdGUiO047czo2OiJiZWZvcmUiO047czo1OiJhZnRlciI7TjtzOjEwOiJleHBpcnlEYXRlIjtOO3M6MTc6IgAqAGRlZmF1bHRPcmRlckJ5IjthOjE6e3M6MTY6ImVudHJpZXMucG9zdERhdGUiO2k6Mzt9czoxMToiZWxlbWVudFR5cGUiO3M6MjA6ImNyYWZ0XGVsZW1lbnRzXEVudHJ5IjtzOjU6InF1ZXJ5IjtOO3M6ODoic3ViUXVlcnkiO047czoxMjoiY29udGVudFRhYmxlIjtzOjEyOiJ7eyVjb250ZW50fX0iO3M6MTI6ImN1c3RvbUZpZWxkcyI7TjtzOjk6ImluUmV2ZXJzZSI7YjowO3M6NzoiYXNBcnJheSI7YjowO3M6MjoiaWQiO047czozOiJ1aWQiO047czoxMDoiZml4ZWRPcmRlciI7YjowO3M6Njoic3RhdHVzIjthOjE6e2k6MDtzOjQ6ImxpdmUiO31zOjg6ImFyY2hpdmVkIjtiOjA7czoxMToiZGF0ZUNyZWF0ZWQiO047czoxMToiZGF0ZVVwZGF0ZWQiO047czo2OiJzaXRlSWQiO3M6MToiMSI7czoxNDoiZW5hYmxlZEZvclNpdGUiO2I6MTtzOjY6ImxlYXZlcyI7YjowO3M6OToicmVsYXRlZFRvIjtOO3M6NToidGl0bGUiO047czo0OiJzbHVnIjtOO3M6MzoidXJpIjtOO3M6Njoic2VhcmNoIjtOO3M6MzoicmVmIjtOO3M6NDoid2l0aCI7TjtzOjc6Im9yZGVyQnkiO2E6Mjp7czoyMToic3RydWN0dXJlZWxlbWVudHMubGZ0IjtpOjQ7czoxNjoiZW50cmllcy5wb3N0RGF0ZSI7aTozO31zOjEzOiJ3aXRoU3RydWN0dXJlIjtiOjE7czoxMToic3RydWN0dXJlSWQiO2I6MDtzOjU6ImxldmVsIjtOO3M6MTQ6Imhhc0Rlc2NlbmRhbnRzIjtOO3M6MTA6ImFuY2VzdG9yT2YiO047czoxMjoiYW5jZXN0b3JEaXN0IjtOO3M6MTI6ImRlc2NlbmRhbnRPZiI7TjtzOjE0OiJkZXNjZW5kYW50RGlzdCI7TjtzOjk6InNpYmxpbmdPZiI7TjtzOjEzOiJwcmV2U2libGluZ09mIjtOO3M6MTM6Im5leHRTaWJsaW5nT2YiO047czoxNjoicG9zaXRpb25lZEJlZm9yZSI7TjtzOjE1OiJwb3NpdGlvbmVkQWZ0ZXIiO047czozOToiAGNyYWZ0XGVsZW1lbnRzXGRiXEVsZW1lbnRRdWVyeQBfcmVzdWx0IjtOO3M6NDc6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3Jlc3VsdENyaXRlcmlhIjtOO3M6NDU6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3NlYXJjaFNjb3JlcyI7TjtzOjY6InNlbGVjdCI7YToxOntpOjA7czoyOiIqKiI7fXM6MTI6InNlbGVjdE9wdGlvbiI7TjtzOjg6ImRpc3RpbmN0IjtOO3M6NDoiZnJvbSI7TjtzOjc6Imdyb3VwQnkiO047czo0OiJqb2luIjtOO3M6NjoiaGF2aW5nIjtOO3M6NToidW5pb24iO047czo2OiJwYXJhbXMiO2E6MDp7fXM6MTg6InF1ZXJ5Q2FjaGVEdXJhdGlvbiI7TjtzOjIwOiJxdWVyeUNhY2hlRGVwZW5kZW5jeSI7TjtzOjI3OiIAeWlpXGJhc2VcQ29tcG9uZW50AF9ldmVudHMiO2E6MDp7fXM6MzU6IgB5aWlcYmFzZVxDb21wb25lbnQAX2V2ZW50V2lsZGNhcmRzIjthOjA6e31zOjMwOiIAeWlpXGJhc2VcQ29tcG9uZW50AF9iZWhhdmlvcnMiO2E6MTp7czoxMjoiY3VzdG9tRmllbGRzIjtPOjM2OiJjcmFmdFxiZWhhdmlvcnNcRWxlbWVudFF1ZXJ5QmVoYXZpb3IiOjE2OntzOjc6ImJsYWhTZW8iO047czoxMjoiaW1hZ2VDYXB0aW9uIjtOO3M6MTU6Im9wdGltaXplZEltYWdlcyI7TjtzOjc6InNlb0NyYXAiO047czo5OiJzb21lQXNzZXQiO047czoxMDoic29tZU1hdHJpeCI7TjtzOjEwOiJzb21lTnVtYmVyIjtOO3M6MTM6InNvbWVQbGFpblRleHQiO047czoxMDoic29tZVJlY2lwZSI7TjtzOjEyOiJzb21lUmljaFRleHQiO047czo4OiJzb21lVW5pdCI7TjtzOjU6InN0dWZmIjtOO3M6MTA6InRlc3RJTWFnZXMiO047czo0OiJ3b29mIjtOO3M6NTE6IgBjcmFmdFxiZWhhdmlvcnNcQ29udGVudEJlaGF2aW9yAF9jdXN0b21GaWVsZFZhbHVlcyI7YTowOnt9czo1OiJvd25lciI7cjoxO319czo1OiJ3aGVyZSI7TjtzOjU6ImxpbWl0IjtpOjIwO3M6Njoib2Zmc2V0IjtOO3M6NzoiaW5kZXhCeSI7TjtzOjE2OiJlbXVsYXRlRXhlY3V0aW9uIjtiOjA7fQ== |
| 2 | 2 | craft\elements\Asset | TzoyODoiY3JhZnRcZWxlbWVudHNcZGJcQXNzZXRRdWVyeSI6NzE6e3M6ODoidm9sdW1lSWQiO047czo4OiJmb2xkZXJJZCI7TjtzOjg6ImZpbGVuYW1lIjtOO3M6NDoia2luZCI7TjtzOjU6IndpZHRoIjtOO3M6NjoiaGVpZ2h0IjtOO3M6NDoic2l6ZSI7TjtzOjEyOiJkYXRlTW9kaWZpZWQiO047czoxNzoiaW5jbHVkZVN1YmZvbGRlcnMiO2I6MDtzOjE0OiJ3aXRoVHJhbnNmb3JtcyI7TjtzOjExOiJlbGVtZW50VHlwZSI7czoyMDoiY3JhZnRcZWxlbWVudHNcQXNzZXQiO3M6NToicXVlcnkiO047czo4OiJzdWJRdWVyeSI7TjtzOjEyOiJjb250ZW50VGFibGUiO3M6MTI6Int7JWNvbnRlbnR9fSI7czoxMjoiY3VzdG9tRmllbGRzIjtOO3M6OToiaW5SZXZlcnNlIjtiOjA7czo3OiJhc0FycmF5IjtiOjA7czoyOiJpZCI7TjtzOjM6InVpZCI7TjtzOjEwOiJmaXhlZE9yZGVyIjtiOjA7czo2OiJzdGF0dXMiO2E6MTp7aTowO3M6NzoiZW5hYmxlZCI7fXM6ODoiYXJjaGl2ZWQiO2I6MDtzOjExOiJkYXRlQ3JlYXRlZCI7TjtzOjExOiJkYXRlVXBkYXRlZCI7TjtzOjY6InNpdGVJZCI7aToxO3M6MTQ6ImVuYWJsZWRGb3JTaXRlIjtiOjE7czo2OiJsZWF2ZXMiO2I6MDtzOjk6InJlbGF0ZWRUbyI7TjtzOjU6InRpdGxlIjtOO3M6NDoic2x1ZyI7TjtzOjM6InVyaSI7TjtzOjY6InNlYXJjaCI7TjtzOjM6InJlZiI7TjtzOjQ6IndpdGgiO047czo3OiJvcmRlckJ5IjthOjE6e3M6MTk6InJlbGF0aW9ucy5zb3J0T3JkZXIiO2k6NDt9czoxMzoid2l0aFN0cnVjdHVyZSI7TjtzOjExOiJzdHJ1Y3R1cmVJZCI7TjtzOjU6ImxldmVsIjtOO3M6MTQ6Imhhc0Rlc2NlbmRhbnRzIjtOO3M6MTA6ImFuY2VzdG9yT2YiO047czoxMjoiYW5jZXN0b3JEaXN0IjtOO3M6MTI6ImRlc2NlbmRhbnRPZiI7TjtzOjE0OiJkZXNjZW5kYW50RGlzdCI7TjtzOjk6InNpYmxpbmdPZiI7TjtzOjEzOiJwcmV2U2libGluZ09mIjtOO3M6MTM6Im5leHRTaWJsaW5nT2YiO047czoxNjoicG9zaXRpb25lZEJlZm9yZSI7TjtzOjE1OiJwb3NpdGlvbmVkQWZ0ZXIiO047czoxNzoiACoAZGVmYXVsdE9yZGVyQnkiO2E6MTp7czoyMDoiZWxlbWVudHMuZGF0ZUNyZWF0ZWQiO2k6Mzt9czozOToiAGNyYWZ0XGVsZW1lbnRzXGRiXEVsZW1lbnRRdWVyeQBfcmVzdWx0IjtOO3M6NDc6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3Jlc3VsdENyaXRlcmlhIjtOO3M6NDU6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3NlYXJjaFNjb3JlcyI7TjtzOjY6InNlbGVjdCI7YToxOntpOjA7czoyOiIqKiI7fXM6MTI6InNlbGVjdE9wdGlvbiI7TjtzOjg6ImRpc3RpbmN0IjtOO3M6NDoiZnJvbSI7TjtzOjc6Imdyb3VwQnkiO047czo0OiJqb2luIjthOjE6e2k6MDthOjM6e2k6MDtzOjEwOiJJTk5FUiBKT0lOIjtpOjE7czoyNDoie3slcmVsYXRpb25zfX0gcmVsYXRpb25zIjtpOjI7YTo0OntpOjA7czozOiJhbmQiO2k6MTtzOjQwOiJbW3JlbGF0aW9ucy50YXJnZXRJZF1dID0gW1tlbGVtZW50cy5pZF1dIjtpOjI7YToyOntzOjE4OiJyZWxhdGlvbnMuc291cmNlSWQiO3M6MToiNCI7czoxNzoicmVsYXRpb25zLmZpZWxkSWQiO3M6MToiMiI7fWk6MzthOjM6e2k6MDtzOjI6Im9yIjtpOjE7YToxOntzOjIyOiJyZWxhdGlvbnMuc291cmNlU2l0ZUlkIjtOO31pOjI7YToxOntzOjIyOiJyZWxhdGlvbnMuc291cmNlU2l0ZUlkIjtpOjE7fX19fX1zOjY6ImhhdmluZyI7TjtzOjU6InVuaW9uIjtOO3M6NjoicGFyYW1zIjthOjA6e31zOjE4OiJxdWVyeUNhY2hlRHVyYXRpb24iO047czoyMDoicXVlcnlDYWNoZURlcGVuZGVuY3kiO047czoyNzoiAHlpaVxiYXNlXENvbXBvbmVudABfZXZlbnRzIjthOjA6e31zOjM1OiIAeWlpXGJhc2VcQ29tcG9uZW50AF9ldmVudFdpbGRjYXJkcyI7YTowOnt9czozMDoiAHlpaVxiYXNlXENvbXBvbmVudABfYmVoYXZpb3JzIjthOjE6e3M6MTI6ImN1c3RvbUZpZWxkcyI7TzozNjoiY3JhZnRcYmVoYXZpb3JzXEVsZW1lbnRRdWVyeUJlaGF2aW9yIjoxNjp7czo3OiJibGFoU2VvIjtOO3M6MTI6ImltYWdlQ2FwdGlvbiI7TjtzOjE1OiJvcHRpbWl6ZWRJbWFnZXMiO047czo3OiJzZW9DcmFwIjtOO3M6OToic29tZUFzc2V0IjtOO3M6MTA6InNvbWVNYXRyaXgiO047czoxMDoic29tZU51bWJlciI7TjtzOjEzOiJzb21lUGxhaW5UZXh0IjtOO3M6MTA6InNvbWVSZWNpcGUiO047czoxMjoic29tZVJpY2hUZXh0IjtOO3M6ODoic29tZVVuaXQiO047czo1OiJzdHVmZiI7TjtzOjEwOiJ0ZXN0SU1hZ2VzIjtOO3M6NDoid29vZiI7TjtzOjUxOiIAY3JhZnRcYmVoYXZpb3JzXENvbnRlbnRCZWhhdmlvcgBfY3VzdG9tRmllbGRWYWx1ZXMiO2E6MDp7fXM6NToib3duZXIiO3I6MTt9fXM6NToid2hlcmUiO047czo1OiJsaW1pdCI7aToxO3M6Njoib2Zmc2V0IjtOO3M6NzoiaW5kZXhCeSI7TjtzOjE2OiJlbXVsYXRlRXhlY3V0aW9uIjtiOjA7fQ== |
| 3 | 2 | craft\elements\MatrixBlock | TzozNDoiY3JhZnRcZWxlbWVudHNcZGJcTWF0cml4QmxvY2tRdWVyeSI6NjU6e3M6NzoiZmllbGRJZCI7czoxOiI2IjtzOjc6Im93bmVySWQiO3M6MToiNCI7czoxMToib3duZXJTaXRlSWQiO047czo2OiJ0eXBlSWQiO047czoxMToiZWxlbWVudFR5cGUiO3M6MjY6ImNyYWZ0XGVsZW1lbnRzXE1hdHJpeEJsb2NrIjtzOjU6InF1ZXJ5IjtOO3M6ODoic3ViUXVlcnkiO047czoxMjoiY29udGVudFRhYmxlIjtzOjI5OiJ7eyVtYXRyaXhjb250ZW50X3NvbWVtYXRyaXh9fSI7czoxMjoiY3VzdG9tRmllbGRzIjtOO3M6OToiaW5SZXZlcnNlIjtiOjA7czo3OiJhc0FycmF5IjtiOjA7czoyOiJpZCI7TjtzOjM6InVpZCI7TjtzOjEwOiJmaXhlZE9yZGVyIjtiOjA7czo2OiJzdGF0dXMiO2E6MTp7aTowO3M6NzoiZW5hYmxlZCI7fXM6ODoiYXJjaGl2ZWQiO2I6MDtzOjExOiJkYXRlQ3JlYXRlZCI7TjtzOjExOiJkYXRlVXBkYXRlZCI7TjtzOjY6InNpdGVJZCI7aToxO3M6MTQ6ImVuYWJsZWRGb3JTaXRlIjtiOjE7czo2OiJsZWF2ZXMiO2I6MDtzOjk6InJlbGF0ZWRUbyI7TjtzOjU6InRpdGxlIjtOO3M6NDoic2x1ZyI7TjtzOjM6InVyaSI7TjtzOjY6InNlYXJjaCI7TjtzOjM6InJlZiI7TjtzOjQ6IndpdGgiO047czo3OiJvcmRlckJ5IjthOjE6e3M6MjI6Im1hdHJpeGJsb2Nrcy5zb3J0T3JkZXIiO2k6NDt9czoxMzoid2l0aFN0cnVjdHVyZSI7TjtzOjExOiJzdHJ1Y3R1cmVJZCI7TjtzOjU6ImxldmVsIjtOO3M6MTQ6Imhhc0Rlc2NlbmRhbnRzIjtOO3M6MTA6ImFuY2VzdG9yT2YiO047czoxMjoiYW5jZXN0b3JEaXN0IjtOO3M6MTI6ImRlc2NlbmRhbnRPZiI7TjtzOjE0OiJkZXNjZW5kYW50RGlzdCI7TjtzOjk6InNpYmxpbmdPZiI7TjtzOjEzOiJwcmV2U2libGluZ09mIjtOO3M6MTM6Im5leHRTaWJsaW5nT2YiO047czoxNjoicG9zaXRpb25lZEJlZm9yZSI7TjtzOjE1OiJwb3NpdGlvbmVkQWZ0ZXIiO047czoxNzoiACoAZGVmYXVsdE9yZGVyQnkiO2E6MTp7czoyMDoiZWxlbWVudHMuZGF0ZUNyZWF0ZWQiO2k6Mzt9czozOToiAGNyYWZ0XGVsZW1lbnRzXGRiXEVsZW1lbnRRdWVyeQBfcmVzdWx0IjtOO3M6NDc6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3Jlc3VsdENyaXRlcmlhIjtOO3M6NDU6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3NlYXJjaFNjb3JlcyI7TjtzOjY6InNlbGVjdCI7YToxOntpOjA7czoyOiIqKiI7fXM6MTI6InNlbGVjdE9wdGlvbiI7TjtzOjg6ImRpc3RpbmN0IjtOO3M6NDoiZnJvbSI7TjtzOjc6Imdyb3VwQnkiO047czo0OiJqb2luIjtOO3M6NjoiaGF2aW5nIjtOO3M6NToidW5pb24iO047czo2OiJwYXJhbXMiO2E6MDp7fXM6MTg6InF1ZXJ5Q2FjaGVEdXJhdGlvbiI7TjtzOjIwOiJxdWVyeUNhY2hlRGVwZW5kZW5jeSI7TjtzOjI3OiIAeWlpXGJhc2VcQ29tcG9uZW50AF9ldmVudHMiO2E6MDp7fXM6MzU6IgB5aWlcYmFzZVxDb21wb25lbnQAX2V2ZW50V2lsZGNhcmRzIjthOjA6e31zOjMwOiIAeWlpXGJhc2VcQ29tcG9uZW50AF9iZWhhdmlvcnMiO2E6MTp7czoxMjoiY3VzdG9tRmllbGRzIjtPOjM2OiJjcmFmdFxiZWhhdmlvcnNcRWxlbWVudFF1ZXJ5QmVoYXZpb3IiOjE2OntzOjc6ImJsYWhTZW8iO047czoxMjoiaW1hZ2VDYXB0aW9uIjtOO3M6MTU6Im9wdGltaXplZEltYWdlcyI7TjtzOjc6InNlb0NyYXAiO047czo5OiJzb21lQXNzZXQiO047czoxMDoic29tZU1hdHJpeCI7TjtzOjEwOiJzb21lTnVtYmVyIjtOO3M6MTM6InNvbWVQbGFpblRleHQiO047czoxMDoic29tZVJlY2lwZSI7TjtzOjEyOiJzb21lUmljaFRleHQiO047czo4OiJzb21lVW5pdCI7TjtzOjU6InN0dWZmIjtOO3M6MTA6InRlc3RJTWFnZXMiO047czo0OiJ3b29mIjtOO3M6NTE6IgBjcmFmdFxiZWhhdmlvcnNcQ29udGVudEJlaGF2aW9yAF9jdXN0b21GaWVsZFZhbHVlcyI7YTowOnt9czo1OiJvd25lciI7cjoxO319czo1OiJ3aGVyZSI7TjtzOjU6ImxpbWl0IjtOO3M6Njoib2Zmc2V0IjtOO3M6NzoiaW5kZXhCeSI7TjtzOjE2OiJlbXVsYXRlRXhlY3V0aW9uIjtiOjA7fQ== |
| 4 | 2 | craft\elements\Asset | TzoyODoiY3JhZnRcZWxlbWVudHNcZGJcQXNzZXRRdWVyeSI6NzE6e3M6ODoidm9sdW1lSWQiO047czo4OiJmb2xkZXJJZCI7TjtzOjg6ImZpbGVuYW1lIjtOO3M6NDoia2luZCI7TjtzOjU6IndpZHRoIjtOO3M6NjoiaGVpZ2h0IjtOO3M6NDoic2l6ZSI7TjtzOjEyOiJkYXRlTW9kaWZpZWQiO047czoxNzoiaW5jbHVkZVN1YmZvbGRlcnMiO2I6MDtzOjE0OiJ3aXRoVHJhbnNmb3JtcyI7TjtzOjExOiJlbGVtZW50VHlwZSI7czoyMDoiY3JhZnRcZWxlbWVudHNcQXNzZXQiO3M6NToicXVlcnkiO047czo4OiJzdWJRdWVyeSI7TjtzOjEyOiJjb250ZW50VGFibGUiO3M6MTI6Int7JWNvbnRlbnR9fSI7czoxMjoiY3VzdG9tRmllbGRzIjtOO3M6OToiaW5SZXZlcnNlIjtiOjA7czo3OiJhc0FycmF5IjtiOjA7czoyOiJpZCI7TjtzOjM6InVpZCI7TjtzOjEwOiJmaXhlZE9yZGVyIjtiOjA7czo2OiJzdGF0dXMiO2E6MTp7aTowO3M6NzoiZW5hYmxlZCI7fXM6ODoiYXJjaGl2ZWQiO2I6MDtzOjExOiJkYXRlQ3JlYXRlZCI7TjtzOjExOiJkYXRlVXBkYXRlZCI7TjtzOjY6InNpdGVJZCI7aToxO3M6MTQ6ImVuYWJsZWRGb3JTaXRlIjtiOjE7czo2OiJsZWF2ZXMiO2I6MDtzOjk6InJlbGF0ZWRUbyI7TjtzOjU6InRpdGxlIjtOO3M6NDoic2x1ZyI7TjtzOjM6InVyaSI7TjtzOjY6InNlYXJjaCI7TjtzOjM6InJlZiI7TjtzOjQ6IndpdGgiO047czo3OiJvcmRlckJ5IjthOjE6e3M6MTk6InJlbGF0aW9ucy5zb3J0T3JkZXIiO2k6NDt9czoxMzoid2l0aFN0cnVjdHVyZSI7TjtzOjExOiJzdHJ1Y3R1cmVJZCI7TjtzOjU6ImxldmVsIjtOO3M6MTQ6Imhhc0Rlc2NlbmRhbnRzIjtOO3M6MTA6ImFuY2VzdG9yT2YiO047czoxMjoiYW5jZXN0b3JEaXN0IjtOO3M6MTI6ImRlc2NlbmRhbnRPZiI7TjtzOjE0OiJkZXNjZW5kYW50RGlzdCI7TjtzOjk6InNpYmxpbmdPZiI7TjtzOjEzOiJwcmV2U2libGluZ09mIjtOO3M6MTM6Im5leHRTaWJsaW5nT2YiO047czoxNjoicG9zaXRpb25lZEJlZm9yZSI7TjtzOjE1OiJwb3NpdGlvbmVkQWZ0ZXIiO047czoxNzoiACoAZGVmYXVsdE9yZGVyQnkiO2E6MTp7czoyMDoiZWxlbWVudHMuZGF0ZUNyZWF0ZWQiO2k6Mzt9czozOToiAGNyYWZ0XGVsZW1lbnRzXGRiXEVsZW1lbnRRdWVyeQBfcmVzdWx0IjtOO3M6NDc6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3Jlc3VsdENyaXRlcmlhIjtOO3M6NDU6IgBjcmFmdFxlbGVtZW50c1xkYlxFbGVtZW50UXVlcnkAX3NlYXJjaFNjb3JlcyI7TjtzOjY6InNlbGVjdCI7YToxOntpOjA7czoyOiIqKiI7fXM6MTI6InNlbGVjdE9wdGlvbiI7TjtzOjg6ImRpc3RpbmN0IjtOO3M6NDoiZnJvbSI7TjtzOjc6Imdyb3VwQnkiO047czo0OiJqb2luIjthOjE6e2k6MDthOjM6e2k6MDtzOjEwOiJJTk5FUiBKT0lOIjtpOjE7czoyNDoie3slcmVsYXRpb25zfX0gcmVsYXRpb25zIjtpOjI7YTo0OntpOjA7czozOiJhbmQiO2k6MTtzOjQwOiJbW3JlbGF0aW9ucy50YXJnZXRJZF1dID0gW1tlbGVtZW50cy5pZF1dIjtpOjI7YToyOntzOjE4OiJyZWxhdGlvbnMuc291cmNlSWQiO3M6MToiNCI7czoxNzoicmVsYXRpb25zLmZpZWxkSWQiO3M6MToiMiI7fWk6MzthOjM6e2k6MDtzOjI6Im9yIjtpOjE7YToxOntzOjIyOiJyZWxhdGlvbnMuc291cmNlU2l0ZUlkIjtOO31pOjI7YToxOntzOjIyOiJyZWxhdGlvbnMuc291cmNlU2l0ZUlkIjtpOjE7fX19fX1zOjY6ImhhdmluZyI7TjtzOjU6InVuaW9uIjtOO3M6NjoicGFyYW1zIjthOjA6e31zOjE4OiJxdWVyeUNhY2hlRHVyYXRpb24iO047czoyMDoicXVlcnlDYWNoZURlcGVuZGVuY3kiO047czoyNzoiAHlpaVxiYXNlXENvbXBvbmVudABfZXZlbnRzIjthOjA6e31zOjM1OiIAeWlpXGJhc2VcQ29tcG9uZW50AF9ldmVudFdpbGRjYXJkcyI7YTowOnt9czozMDoiAHlpaVxiYXNlXENvbXBvbmVudABfYmVoYXZpb3JzIjthOjE6e3M6MTI6ImN1c3RvbUZpZWxkcyI7TzozNjoiY3JhZnRcYmVoYXZpb3JzXEVsZW1lbnRRdWVyeUJlaGF2aW9yIjoxNjp7czo3OiJibGFoU2VvIjtOO3M6MTI6ImltYWdlQ2FwdGlvbiI7TjtzOjE1OiJvcHRpbWl6ZWRJbWFnZXMiO047czo3OiJzZW9DcmFwIjtOO3M6OToic29tZUFzc2V0IjtOO3M6MTA6InNvbWVNYXRyaXgiO047czoxMDoic29tZU51bWJlciI7TjtzOjEzOiJzb21lUGxhaW5UZXh0IjtOO3M6MTA6InNvbWVSZWNpcGUiO047czoxMjoic29tZVJpY2hUZXh0IjtOO3M6ODoic29tZVVuaXQiO047czo1OiJzdHVmZiI7TjtzOjEwOiJ0ZXN0SU1hZ2VzIjtOO3M6NDoid29vZiI7TjtzOjUxOiIAY3JhZnRcYmVoYXZpb3JzXENvbnRlbnRCZWhhdmlvcgBfY3VzdG9tRmllbGRWYWx1ZXMiO2E6MDp7fXM6NToib3duZXIiO3I6MTt9fXM6NToid2hlcmUiO047czo1OiJsaW1pdCI7aToxO3M6Njoib2Zmc2V0IjtpOjA7czo3OiJpbmRleEJ5IjtOO3M6MTY6ImVtdWxhdGVFeGVjdXRpb24iO2I6MDt9 |
+----+---------+----------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

Although the nomen­cla­ture is dif­fer­ent, the pur­pose is the same: to keep track of where you might have queries like {% craft.entries.section('blog').limit(20) %} in your templates.

This is so that if an ele­ment changes inside one of your queries that’s in a {% cache %} tag, the cache will be bust­ed to reflect the new data.

If you’re won­der­ing why the Craft 3.x query looks the way it does, it is because this is a seri­al­ized ver­sion of the bina­ry Query object.

Again, note that if you have a whole lot of queries inside of your {% cache %} tags, you’re going to end up with a whole lot of rows in the database.

If we have a web­site with 10,000 blog entries on it, and each blog has 10 Ele­ment Queries inside of the {% cache %} tag, that means we’ll end up with 10,000 rows in the templatecaches table, and 100,000 rows in the templatecachequeries or templatecachecriteria tables. For the blog alone.

Cache as Cache Can

The {% cache %} tag can do a whole lot more, which you can read up on at the Craft Tem­plat­ing Docs page. Hope­ful­ly this gen­tle intro­duc­tion got you think­ing about when and how to use it.

If you want the ulti­mate in cache-based per­for­mance, check out the Sta­t­ic Page Caching with Craft CMS article.

Further Reading

If you want to be notified about new articles, follow nystudio107 on Twitter.

Copyright ©2020 nystudio107. Designed by nystudio107

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Instrument, monitor, fix: a hands-on debugging session

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️