Skip to main content

Entity and render Caching for Drupal performance

Drupal’s entity system is powerful, but without proper caching, it can become a performance bottleneck. Understanding entity and render caching is crucial for building high-performance Drupal websites that can handle complex content structures efficiently.

In this blog, we’ll uncover the strategies that made this transformation possible.

Entity Caching fundamentals

In-depth explanation

Drupal’s entity caching system is a multi-layered mechanism that optimises performance by reducing redundant database queries and PHP processing. To understand its depth, let’s break down each layer and explore how it works under the hood.

1. Entity load Caching

What it does
When an entity (e.g., a node, user, or taxonomy term) is requested, Drupal typically queries the database to load its raw data. Entity Load Caching stores this raw data in the cache_entity bin (by default) to avoid repeated database calls for the same entity. The cache key is typically in the format entity:{entity_type}:{id}:{langcode} (e.g., entity:node:123:en).

Technical mechanics

Why It matters

2. Render Caching

What it does
After an entity is loaded, Drupal generates a render array (a structured PHP array defining how the entity should be displayed). Render Caching stores these arrays to avoid rebuilding them on every request.

Technical mechanics

Why it matters

Example:

3. View mode Caching

What it does
Entities are often displayed in different formats (e.g., “teaser” for listings and “full” for detail pages). View Mode Caching stores separate render arrays for each view mode to avoid redundant processing.

Technical mechanics

Why it matters

Example hook:

4. Field-level Caching

What it does
Fields (e.g., a “body” text field or an “image” field) can be cached individually to avoid reprocessing static content.

Technical mechanics

Why it matters

Example hook:

Use Case 1: Hybrid Caching for a product catalogue

Scenario

An e-commerce site needs fast delivery of product pages for anonymous users but must update instantly when inventory changes.

Goal

Combine entity load caching with tag-based invalidation to reduce database queries while keeping content fresh.

Sample implementation

Explanation:
This caches product entities for 1 hour (max-age) but clears the cache when the entity is edited (node:$nid) or when the product list changes (product_list).

Render pipeline overview

In-depth explanation

The render pipeline is the sequence of steps Drupal uses to transform entities into HTML. Let’s dissect each stage and explore its role in caching.

1. Entity loading

What happens

Caching interaction

2. Field value loading

What happens

Caching interaction

3. Render array generation

What happens

Caching interaction

4. Cache Metadata collection

What happens

Technical details

Example:

5. Final rendering

What happens

Caching interaction

Performance impact

Use Case 2: Debugging slow page loads

Scenario

A news site’s article pages take 2+ seconds to load. Profiling shows repeated field processing.

Goal

Add cache metadata to preprocess functions to reduce redundant processing.

Sample implementation

Explanation:
This caches the rendered HTML for 30 minutes, varying by user role and language. Tags ensure the cache clears when the article is updated.

Cache contexts and tags

In-depth explanation

Drupal’s caching system relies on cache contexts and cache tags to balance performance with precision. These mechanisms ensure cached content is both fast and correct, avoiding stale data while minimizing redundant computation. Let’s dissect their mechanics, interactions, and real-world implications.

1. Cache contexts: when to vary the Cache

What they do
Cache contexts define when cached content should differ. They act as variation keys—if any context value changes, Drupal generates a new cache entry.

Technical mechanics

Why it matters

Example:

2. Cache tags: how to invalidate the Cache

What they do
Cache tags define what triggers cache invalidation. They tie cached data to entities or external dependencies (e.g., node:123, config:system.site). When a tag is invalidated, all cache entries referencing it are cleared.

Technical mechanics

Why it matters

Example:

3. Interplay between contexts and tags

How they work together

Example:

Use case 3: multilingual Caching pitfalls

Scenario

A multilingual site serves French and English articles. Without proper caching, users occasionally see mixed-language content.

Goal

Cache article pages by language to prevent mixed outputs.

Sample implementation

Explanation:
This ensures the cache varies by language, preventing French users from seeing English content and vice versa.

Field-level Caching

In-depth explanation

Field-level caching optimises performance by storing the rendered output of individual fields (e.g., text, images, computed values) independently. This allows static fields to be cached for extended periods while dynamic fields remain fresh. Unlike entity-level caching, field-level caching operates at a granularity that avoids reprocessing expensive formatters (e.g., geolocation maps, computed prices) unnecessarily.

1. Technical mechanics of field Caching

A. field formatters and render arrays
Fields are rendered via formatters, which are plugins implementing FieldFormatterInterface. Each formatter generates a render array with attached cache metadata.

Example formatter flow:

B. Cache metadata bubbling
Field-level cache metadata (contexts, tags, max-age) is bubbled up to parent containers (e.g., entities, pages) during render pipeline processing. This ensures invalidation cascades correctly.

Example:
A node’s field_image with #cache['tags'] = ['node:123'] ensures the entire node’s cache clears when the image updates.

Use case 4: conditional Caching for user-specific fields

Scenario

A price field must show discounted prices to logged-in users but static pricing for guests.

Goal

Cache the field for 30 minutes, but vary by user role.

Sample implementation

Explanation:
This creates separate cache entries for different user roles while invalidating the cache when the price field changes.

Cache bubbling

In-depth explanation

Cache bubbling is the process by which cache metadata (contexts, tags, and max-age) from deeply nested render elements (e.g., fields, blocks, forms) propagates upward to parent containers (e.g., entities, pages). This mechanism ensures that the caching behaviour of a composite element reflects all its dependencies, preventing stale content and maintaining cache coherence across the entire render tree.

Without cache bubbling, a parent container might cache independently of its children, leading to situations where an updated field or block remains invisible until the parent’s cache expires. Bubbling guarantees that invalidation cascades correctly and that cache variations (e.g., role-specific content) are preserved at every level.

1. Technical mechanics of Cache bubbling

A. How metadata propagates
Cache metadata flows upward through the render array hierarchy:

Example:

B. Bubbleable metadata interface
Drupal core uses the BubbleableMetadata class to manage metadata propagation. Developers can manually manipulate it:

use Drupal\Core\Render\BubbleableMetadata;

2. Why Cache bubbling matters

Example:
A node with a field_comments block will inherit the block’s comment:* tags. Updating a comment invalidates the node’s cache.

Use Case 5: Debugging Cache bubbling

Scenario

A custom block inside an article page isn’t invalidated when the article is updated.

Goal

Log cache metadata to identify missing dependencies.

Sample implementation

Explanation:
This logs cache metadata to help identify if the block is missing a critical tag like node:123.

Performance optimisation techniques

In-depth explanation

Optimising caching in Drupal requires balancing speed and correctness. By applying targeted strategies, developers can reduce server load while ensuring users see up-to-date content. Below are battle-tested techniques, complete with code examples and real-world applications.

1. Use granular Cache tags

Why it matters
Broad tags like content_type:article invalidate caches unnecessarily. Granular tags (e.g., node:123, field: price) ensure only relevant content updates.

Technical implementation

Example:

2. Minimise Cache contexts

Why it matters
Each context multiplies the number of cache variants. For example, URL context creates separate caches for /page vs. /page?foo=bar, even if the content doesn’t vary by query parameters.

Technical implementation

Example:

3. Leverage Render Cache Selectively

Why it matters
Not all content benefits from caching. Static fields (e.g., author bios) gain speed, while dynamic content (e.g., form validation errors) must bypass caching.

Technical implementation

Example:

4. Avoid Caching sensitive data

Why it matters
Caching session-specific or PII (Personally Identifiable Information) risks exposing private data. Always vary by user or disable caching entirely.

Technical implementation

Example:

5. Monitor and benchmark Cache effectiveness

Why it matters
Caching optimisations are only valuable if they reduce database load and improve page speed. Use metrics to validate changes.

Technical implementation

Example:

Common pitfalls and how to avoid them

Use case 6: benchmarking Cache effectiveness

Scenario

After implementing caching, a news site sees inconsistent performance improvements.

Goal

Quantify gains and identify bottlenecks.

Metrics comparison

Sample implementation

Explanation:

Connecting to the render pipeline

Performance optimisations integrate seamlessly into the render pipeline:

By applying these techniques, developers transform Drupal’s caching system from a generic tool into a finely tuned performance engine. In the next section, we’ll explore Implementation Examples to solidify these concepts with real-world codebases.

Implementation examples

Example: Custom view mode Caching

Scenario

A media library’s “grid view” needs caching but must refresh when new media is uploaded.

Goal

Cache the view mode for 2 hours, but invalidate when media entities change.

Sample implementation

Series navigation

This article is part of our comprehensive 10-part series on Drupal caching:

What’s next?

Effective use of Drupal’s entity and render caching can significantly improve site performance, especially when dealing with complex content structures and high-traffic scenarios. By understanding how caching metadata works, contexts, tags, and max-age, and applying it to real-world cases like views, blocks, and referenced entities, developers can reduce unnecessary processing and deliver faster, more scalable experiences.

Mastering these built-in systems is just the beginning. In our next article, we’ll take caching a step further by building custom caching services in Drupal. You’ll learn how to tailor caching logic for unique business needs, configure and switch cache backends, and implement layered strategies that go beyond what the core provides.

Stay tuned for the next part of this series on custom caching services.

We'd love to talk about your business objectives

Written by