I think we call all agree on the fact that cache can improve the performance of your website significantly. Kentico has lots of features doing the caching for you. But some things you'll have to set yourself. Nothing to worry about as Kentico made it easy for you to do!
Cache is a storage that allows faster access to previously requested data so its ready for future requests.
The two main benefits are:
- Quicker loading of data (instead of a usually slower Webservice, SQL or file system call)
- Reduction of processing for the same page requests.
In other words the 'lazier' the code (since it has less to do) the faster your site becomes.
So you've went through the Kentico Settings module and on the System
group you've enabled output
and partial caching
. So you're done now right?
If only it where that simple. If you've had the time to read the Information icons you could see that you still need to enable
caching for a particular page or web part.
Kentico offers different types of Cache, but I'll currently talk about the Partial Output Cache
and the full page Output Cache
- Content suitable for output cache are actually all pages that don't have any 'dynamic' parts. For example a contact details page (without a form).
- Content suitable for partial cache are pieces that don't have 'dynamic' parts of all other pages not suitable for output cache. For example the web part containing the site menu.
I say dynamic between quotes since they can of course still change, but not as often as for example a Twitter-feed.
Output Cache (full page)
Page output cache needs to be set on the pages directly. All pages on deeper levels can inherit these settings from their parent.
Depending on your settings it will look something like this:
the 'use output cache
' setting and set a number of minutes after which you want it to expire. The first request to this page will now create a cache item and the page is cached!
Partial Output Cache
When you want to cache just part of the specific page you can also use Partial output cache on web parts.
Simply go to settings of the Web Part
(either by using the Design
tab in the Pages
Module or the Template
Scroll down to the Performance
section and enter a number in the Partial cache minutes text box.
I'll talk about dependencies later
From now on also the part of the page this web part renders will be cached!
But does it work
So that's fine and all but does is really help?
I've created an empty sample page with a repeater on it displaying
- first 3 characters of the NodeName
- Random order
- Top 500 pages
Because of the random order this normally seems like dynamic content so not something you'd want to cache. But in my case it would make it more easy to see if the result is really cached.
Since you cache the complete output you can't use the Kentico debug tools. For my example I used the Firebug add-on for Firefox. But most developer browser tools have a similar feature. You'll want a tool to show you the network loading times and size per request and break it down per type or request.
So without cache I got the following first request:
And the second request:
So besides a lesson in Dutch you can see that it improved the loading time from over a second to almost none. It is still the same size, just over 13KB and the random data seems in the same order.
Do you want even more proof?
You can also see the caching itself happen.
Go into the Kentico Settings
module and on the System
> Cache access
group enable the debug. Never do this on production!
(Don't forget to uncheck the Disable debugging
setting on the top of this settings page).
Now if you make a first request to our page (clear the cache first) you'll see a list on the bottom of the page. This is rendered by Kentico and shows you the Cache additions or requests.
I've altered it a bit so it's easier to see, but the number 5 is created by our repeater and has an addition to the Cache.
Inspect the cache
In the previous image you also see the cache key
used to store the date. If you go to the Debug
module and search for the key itself in the Cache Items
you can see more information about this cache key. As you can see in the image below you can explore what objects are in the cache, whats the size and also when it's expiring.
If you click the Eye icon you can even see the data itself. You might also notice that although I now use caching the cached data itself is over 1.1 MB. Since it's just to show 500 ID's and Node names this seems a bit much. If you look closely you see the cache contains a table with 500 rows and over 300 columns!
So remember just caching everything isn't the only solution! Always think about what data you're needing.
Simply by adding the NodeID and NodeName to the Columns field in the Repeater I got it down to 60kB!
There are some extra columns needed by the Repeater or the Cache settings.
In the next parts I'll continue about Cache dependencies, Caching in custom code and more...