Headless.Caching.Hybrid 0.4.15

dotnet add package Headless.Caching.Hybrid --version 0.4.15
                    
NuGet\Install-Package Headless.Caching.Hybrid -Version 0.4.15
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Headless.Caching.Hybrid" Version="0.4.15" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Headless.Caching.Hybrid" Version="0.4.15" />
                    
Directory.Packages.props
<PackageReference Include="Headless.Caching.Hybrid" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Headless.Caching.Hybrid --version 0.4.15
                    
#r "nuget: Headless.Caching.Hybrid, 0.4.15"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Headless.Caching.Hybrid@0.4.15
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Headless.Caching.Hybrid&version=0.4.15
                    
Install as a Cake Addin
#tool nuget:?package=Headless.Caching.Hybrid&version=0.4.15
                    
Install as a Cake Tool

Headless.Caching.Hybrid

Two-tier hybrid cache combining fast in-memory L1 cache with distributed L2 cache, featuring automatic cross-instance cache invalidation via messaging.

Installation

dotnet add package Headless.Caching.Hybrid

Prerequisites

  • In-memory cache: Headless.Caching.Memory
  • Distributed cache: Headless.Caching.Redis
  • Messaging: Any messaging provider (e.g., Headless.Messaging.Redis)

Usage

Basic Setup

services.AddInMemoryCache(isDefault: false);
services.AddRedisCache(options => options.ConnectionString = "localhost:6379");
services.AddHeadlessMessaging(builder => builder.UseRedis("localhost:6379"));
services.AddHybridCache(options =>
{
    options.DefaultLocalExpiration = TimeSpan.FromMinutes(5);
});

Using the Cache

public class ProductService(ICache cache)
{
    public async Task<Product?> GetProductAsync(string id, CancellationToken ct)
    {
        return (await cache.GetOrAddAsync(
            $"product:{id}",
            async token => await _repository.GetByIdAsync(id, token),
            TimeSpan.FromHours(1),
            ct
        )).Value;
    }
}

Architecture

┌─────────────────────────────────────────────────────────────────┐
│                         HybridCache                              │
│  ┌─────────────┐    ┌─────────────┐    ┌──────────────────────┐ │
│  │ L1 Cache    │    │ L2 Cache    │    │ Message Bus          │ │
│  │ (InMemory)  │    │ (Redis)     │    │ (Pub/Sub)            │ │
│  │             │    │             │    │                      │ │
│  │ - Fast      │    │ - Shared    │    │ - Invalidation       │ │
│  │ - Per-inst. │    │ - Durable   │    │ - Cross-instance     │ │
│  └─────────────┘    └─────────────┘    └──────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

Read Path

  1. Check L1 (local in-memory) - fastest, per-instance
  2. On L1 miss, check L2 (distributed) - slower but shared
  3. On L2 miss, execute factory, populate both caches

Write/Invalidation Path

  1. Update L2 (distributed cache)
  2. Update L1 (local cache)
  3. Publish invalidation message
  4. Other instances receive message and invalidate their L1

Configuration

Option Default Description
KeyPrefix "" Prefix for all cache keys
DefaultLocalExpiration 5 minutes Default L1 TTL (uses L2 TTL if null)
InstanceId Auto-generated Unique ID for filtering self-originated messages

Exception Handling

Scenario Behavior
L2 write fails Log warning, continue to populate L1
Publish fails Log warning, other instances serve stale until TTL
L1 write fails Propagate exception (indicates serious issue)
L2 read fails Propagate exception
OperationCanceledException Always propagate

Metrics

The HybridCache exposes metrics:

var cache = services.GetRequiredService<HybridCache>();
Console.WriteLine($"L1 hits: {cache.LocalCacheHits}");
Console.WriteLine($"Invalidation calls: {cache.InvalidateCacheCalls}");
Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.4.15 95 5/18/2026
0.4.14 95 5/18/2026