How It Works Pricing Benchmarks
vs Redis Docs Resources Blog
Start Free Trial
New Primitive

Stop Invalidating Entire Responses
Because One Field Changed.

Cache fragments independently. Compose them at read time in microseconds. When user.name changes, user.orders stays cached. Zero over-invalidation.

Fragment
Level Invalidation
µs
Composition Time
Zero
Over-Invalidation
GraphQL
Native
The Problem

Monolithic Caching Is a 2015 Pattern

Every time you cache a full API response, you are creating an invalidation bomb. One field changes and the entire entry is evicted — even though 95% of the data is still valid.

💣
Monolithic Cache Entries
You cache the whole API response as a single key. A user updates their display name. The entire response — orders, preferences, billing, activity — is evicted. You recompute everything from scratch because one field changed. This is how every cache works today.
1 field change = 100% cache miss
🌐
The GraphQL Problem
Every GraphQL query shape is unique. Caching full responses means a separate cache entry for every combination of fields a client requests. Two queries that share 90% of the same fields get zero cache reuse. Resolver-level caching is manual, fragile, and doesn't compose across nested types.
Unique query shapes = zero cache reuse
📉
The Over-Invalidation Tax
Teams know they are over-invalidating, but the alternative — stale data — is worse. So they invalidate aggressively: broad pattern flushes, short TTLs, or skip caching entirely for composite responses. Hit rates drop 20–40%. The cache exists but barely helps.
Aggressive invalidation = 20-40% hit rate loss
How It Works

Cache Fragments. Compose at Read Time.

Store each piece of a response as an independent cache entry. Use the FUSE command to assemble them into a complete response at read time. Composition happens via pointer assembly — no serialization, no deserialization. Microseconds.

# Store fragments independently SET user:123:name "Jane Doe" SET user:123:prefs '{"theme":"dark","lang":"en"}' SET user:123:orders '[{"id":901,"total":49.99},{"id":887,"total":124.00}]' SET user:123:billing '{"plan":"pro","renewal":"2026-04-15"}' # Compose them at read time with FUSE FUSE user:123:profile FROM user:123:name user:123:prefs user:123:orders user:123:billing # user.name changes? Only that fragment is invalidated: SET user:123:name "Jane Smith" # user:123:prefs --> still cached (HIT) # user:123:orders --> still cached (HIT) # user:123:billing --> still cached (HIT) # Next FUSE reads 1 fresh fragment + 3 cached fragments # Composition: ~3 microseconds
Fragment Composition — Surgical Invalidation
Updated Fragment
user:123:name
Cached (HIT)
user:123:prefs
Cached (HIT)
user:123:orders
Cached (HIT)
user:123:billing
↓ ↓ ↓ ↓
FUSE — Composed Response
user:123:profile
~3µs pointer assembly
Result
1 field changed → 1 fragment invalidated → 3 fragments still hot
Monolithic caching would have evicted the entire response. Cache Fusion keeps 75% of your data cached.

Pointer Assembly, Not Serialization

FUSE does not deserialize fragments, merge JSON objects, or run any transform logic. Each fragment is already stored as a cache value. The engine reads the pointers, assembles a composite structure, and returns it. The cost is a handful of pointer reads — typically under 5 microseconds for a 4-fragment composition.

This means composition cost is constant regardless of fragment size. A 10KB order history and a 50-byte name field are both a single pointer read. The engine does not touch the payload data during assembly.

Fragment Reuse Across Queries

The same fragment is reused by every FUSE that references it. A dashboard FUSE and a profile FUSE can both reference user:123:orders. The fragment is stored once. Two compositions, one cache entry.

This is the key insight for GraphQL. Different query shapes are just different FUSE operations over the same fragments. A query for {user{name,orders}} and a query for {user{name,billing}} share the user:123:name fragment. Fragment caching solves the combinatorial explosion of query shapes.

Impact

Monolithic vs Fragment Hit Rates

Monolithic caching forces full invalidation on any change. Fragment caching isolates changes to the piece that actually updated. The hit rate difference is not incremental — it is structural.

Metric Monolithic Caching Cache Fusion (Fragments)
Cache Hit Rate 60–70% 90–95%
Invalidation Scope Entire response (all fields) Single fragment (changed field only)
GraphQL Query Caching One entry per query shape Shared fragments across all shapes
Recomputation on Change Full response rebuild Fetch 1 fragment, compose cached rest
Memory Efficiency Duplicate data across entries Fragments stored once, reused everywhere
Cache Hit Rate Under Typical Write Load
Monolithic
65% hit rate
Cache Fusion
95% hit rate
Scenario: user profile endpoint with 4 fragments, 10 writes/sec across all fields. Monolithic invalidates the entire entry on every write. Cache Fusion invalidates only the changed fragment.
GraphQL

GraphQL Caching, Actually Solved

Every GraphQL resolver's data becomes a cache fragment. The FUSE operation assembles the response shape at the cache layer. Different query shapes reuse the same fragments. The combinatorial explosion of query shapes stops being a problem.

# GraphQL query: { user(id: 123) { name, orders { id, total } } } # Maps to fragments: FUSE gql:user:123:q1 FROM user:123:name user:123:orders # Different query: { user(id: 123) { name, billing { plan } } } # Different shape, shared fragments: FUSE gql:user:123:q2 FROM user:123:name user:123:billing # Both queries share user:123:name # Updating name invalidates one fragment, both queries recompose # Updating orders only affects q1 -- q2 is completely untouched
🧩
Resolver = Fragment
Each GraphQL resolver's output maps to one cache fragment. The resolver fetches data and stores it under a fragment key. The cache layer handles composition. This means resolver code stays simple — it fetches one thing and caches one thing. The FUSE layer handles the shape assembly.
Clean separation: resolvers fetch, FUSE composes
♻️
Cross-Query Fragment Reuse
A mobile client requests 4 fields. A web client requests 12 fields. A dashboard requests 20 fields. All three query shapes share the same underlying fragments. No duplicate storage. No duplicate invalidation. A change to one fragment is visible to every query that includes it, instantly.
N query shapes, 1 set of fragments
Composition

Composes With Dependency Graph & CDC

Cache Fusion is not a standalone feature. Fragments can have dependencies. CDC can trigger fragment invalidation. The composition of these primitives creates behavior that no other caching system can replicate.

💾
Fragments + Dependency Graph
Fragments can declare dependencies using DEPENDS_ON. When a source key changes, only the dependent fragment is invalidated — not the entire FUSE composition. The dependency graph operates at fragment granularity, giving you surgical invalidation at every level of the stack.
DEPENDS_ON works at fragment level
🔄
Fragments + CDC
A database row changes. CDC auto-invalidation evicts the corresponding fragment — not the whole response. The orders table gets a new row, CDC fires, user:123:orders is invalidated. Name, prefs, and billing fragments stay hot. The next FUSE assembles 1 fresh fragment + 3 cached fragments.
DB row change → 1 fragment invalidated
Fragments + Coherence
Cross-instance coherence propagates fragment invalidation to every Cachee instance in the namespace. Service A updates a fragment on instance 1, and every instance in the cluster invalidates that single fragment. The rest of the FUSE composition stays hot across the entire fleet.
Fragment-level coherence across instances

Learn more about causal dependency graphs, CDC auto-invalidation, and cross-service coherence.

Use Cases

Where Fragment Composition Wins

🌐
GraphQL APIs
Each resolver is a fragment. FUSE assembles the response shape. Different clients request different fields and share the same cached fragments. Invalidation is per-resolver, not per-query-shape. This makes GraphQL caching practical for the first time — no custom resolver caching, no Dataloader hacks, no per-shape cache keys.
Resolver-level caching without resolver-level code
📊
SaaS Dashboards
Each dashboard widget is a fragment: revenue chart, active users, recent activity, usage meter. When the billing system updates, only the revenue fragment invalidates. The active users widget, the activity feed, and the usage meter stay cached. Dashboard load time stays under 50ms even during high write volume.
Widget = fragment, dashboard = FUSE
🚀
API Gateway Response Assembly
An API gateway aggregates responses from 5 microservices into a single client payload. Each microservice response is a fragment. The gateway FUSE assembles the composite. When Service C deploys a new version and its data changes, only the Service C fragment is invalidated. The other 4 stay hot.
Gateway FUSE replaces backend fan-out
👤
Personalized Content
Base template + user-specific fragments. The product page layout, pricing grid, and feature descriptions are shared fragments cached once for all users. User-specific data — name, plan badge, recommendations — are personal fragments. FUSE composes them. Personalization without per-user full-page caching.
Shared base + personal fragments = efficient personalization
Monolithic caching is a 2015 pattern.
Fragment composition is how modern APIs should cache.
FAQ

Frequently Asked Questions

What is Cache Fusion?

Cache Fusion is a fragment composition system that stores individual pieces of a response as independent cache entries and assembles them at read time using the FUSE command. When one fragment is invalidated, only that fragment is evicted — every other fragment in the composition remains cached. This eliminates over-invalidation and dramatically increases cache hit rates for composite responses.

How does the FUSE command work?

FUSE takes a destination key and a list of source fragment keys. For example: FUSE user:123:profile FROM user:123:name user:123:prefs user:123:orders user:123:billing. The cache engine reads each fragment, assembles them into a single response object, and returns the composed result. Composition happens via pointer assembly in microseconds — no serialization or deserialization is required.

How does it work with GraphQL?

Each GraphQL resolver's data is stored as an independent cache fragment. The FUSE operation assembles the response shape at the cache layer, matching the query's field selection. Different query shapes reuse the same underlying fragments, so a query requesting user.name and user.orders shares fragments with a query requesting user.name and user.billing. Fragment reuse across query shapes is what makes GraphQL caching practical.

What is over-invalidation and how does Cache Fusion solve it?

Over-invalidation occurs when a cache entry is evicted because any part of its data changed, even though most of the data is still valid. With monolithic caching, updating a user's name invalidates the entire user response — including orders, preferences, and billing data that did not change. Cache Fusion solves this by caching each piece independently. Only the name fragment is invalidated; every other fragment stays hot. Hit rates improve from 60–70% (monolithic) to 90–95% (fragment-based).

Does fragment composition add latency to cache reads?

Composition adds negligible latency — typically under 5 microseconds for a 4-fragment assembly. The FUSE operation performs pointer assembly, not serialization. All fragments are already in memory as cached values. The engine reads each pointer, assembles the result structure, and returns it. For most workloads, the composition overhead is invisible compared to the latency savings from avoiding cache misses on the entire response.

Stop Over-Invalidating.
Cache Fragments. Compose at Read Time.

Fragment composition. Dependency graphs. CDC auto-invalidation. Cross-instance coherence. Zero over-invalidation. Zero application code.

Start Free Trial Schedule Demo