Take the community feedback survey now.

Johan Björnfot
Nov 7, 2019
  64
(0 votes)

A smarter output cache

During Ascend I saw on Linus Ekströms whishlist for better CDN support that he would like to be able to get a list of all content items that are part of a pages rendered output. I then recalled that I had done something in a related area before, see Russian doll caching. So now when we had a hackday I decided to see if I could build something that would fulfil Linus wish. So I took some inspiration from my previous work and created a context ContentRenderingTrackerContext that stores information about all content items that are used during rendering of a request. It also keeps track if something on the rendering is personalized (ContentArea or XHtmlString). I then intercepted some components in CMS like PropertyRenderer (used by PropertyFor) to collect data in the context. This component is available in project ContentRenderingTracker.

Smarter output cache

Then to test my tracker component I decided to create a ContentAwareOutputCacheAttribute. It works a bit as the built-in attribute ContentOutputCacheAttribute but it is a little smarter. So for example when a content item is changed will it only invalidates the output cache for those pages that actually has used the changed content item, compared to the built-in who invalidates the output cache for all pages (since it does not know where the content item is used). The new attribute also uses the knowledge about usage of personalized content from the context and will not output cache pages that has personalized content (meaning the attribute can be used on all controllers and it will take care of if it should output cache or not due to personalized content usage). The attribute is available in project ContentAwareOutputCache.

Output cache in Redis

The output cache attribute worked nice but it still requires that the page is rendered once (on that specific instance) before it gets output cached. I therefore decided to write a mvc filter that works in a similar way as the ContentAwareOutputCacheAttribute but with the difference that it caches the rendered page in Redis instead. The nice thing with this is that it also adresses the cold-start scenario (for example when a new instance of the web application is spun up due to scaling out). In that case can a new empty instance directly utilize the output cache without the need to do an initial rendering. That implementation is available in project RedisOutputCache

I also added two versions of alloy, one that uses the attribute and one that uses the Redis caching. All code is available in repository ContentRenderingTracker.

Disclaimer

This is nothing offically supported by EPiServer, you are free to use it as you like at your own risk.

Nov 07, 2019

Comments

Please login to comment.
Latest blogs
A day in the life of an Optimizely OMVP - Opticon London 2025

This installment of a day in the life of an Optimizely OMVP gives an in-depth coverage of my trip down to London to attend Opticon London 2025 held...

Graham Carr | Oct 2, 2025

Optimizely Web Experimentation Using Real-Time Segments: A Step-by-Step Guide

  Introduction Personalization has become de facto standard for any digital channel to improve the user's engagement KPI’s.  Personalization uses...

Ratish | Oct 1, 2025 |

Trigger DXP Warmup Locally to Catch Bugs & Performance Issues Early

Here’s our documentation on warmup in DXP : 🔗 https://docs.developers.optimizely.com/digital-experience-platform/docs/warming-up-sites What I didn...

dada | Sep 29, 2025

Creating Opal Tools for Stott Robots Handler

This summer, the Netcel Development team and I took part in Optimizely’s Opal Hackathon. The challenge from Optimizely was to extend Opal’s abiliti...

Mark Stott | Sep 28, 2025

Integrating Commerce Search v3 (Vertex AI) with Optimizely Configured Commerce

Introduction This blog provides a technical guide for integrating Commerce Search v3, which leverages Google Cloud's Vertex AI Search, into an...

Vaibhav | Sep 27, 2025

A day in the life of an Optimizely MVP - Opti Graph Extensions add-on v1.0.0 released

I am pleased to announce that the official v1.0.0 of the Opti Graph Extensions add-on has now been released and is generally available. Refer to my...

Graham Carr | Sep 25, 2025