ZiggyCreatures.FusionCache 1.4.0

Prefix Reserved
dotnet add package ZiggyCreatures.FusionCache --version 1.4.0                
NuGet\Install-Package ZiggyCreatures.FusionCache -Version 1.4.0                
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="ZiggyCreatures.FusionCache" Version="1.4.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ZiggyCreatures.FusionCache --version 1.4.0                
#r "nuget: ZiggyCreatures.FusionCache, 1.4.0"                
#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.
// Install ZiggyCreatures.FusionCache as a Cake Addin
#addin nuget:?package=ZiggyCreatures.FusionCache&version=1.4.0

// Install ZiggyCreatures.FusionCache as a Cake Tool
#tool nuget:?package=ZiggyCreatures.FusionCache&version=1.4.0                

FusionCache

FusionCache logo

FusionCache is an easy to use, fast and robust hybrid cache with advanced resiliency features.

It was born after years of dealing with all sorts of different types of caches: memory caching, distributed caching, http caching, CDNs, browser cache, offline cache, you name it. So I've tried to put together these experiences and came up with FusionCache.

FusionCache diagram

Being a hybrid cache means it can transparently work as either a normal memory cache (L1) or as a multi-level cache (L1+L2), where the distributed 2nd level (L2) can be any implementation of the standard IDistributedCache interface: this will get us better cold starts, better horizontal scalability, more resiliency and overall better performance.

FusionCache also includes an optional backplane for realtime sync between multiple nodes and advanced resiliency features like cache stampede protection, a fail-safe mechanism, soft/hard timeouts, eager refresh, full observability via logging and OpenTelemetry and much more.

🏆 Award

On August 2021, FusionCache received the Google Open Source Peer Bonus Award: here is the official blogpost.

📕 Getting Started

With đŸĻ„ A Gentle Introduction you'll get yourself comfortable with the overall concepts.

Want to start using it immediately? There's a ⭐ Quick Start for you.

Curious about what you can achieve from start to finish? There's a 👩‍đŸĢ Step By Step guide.

In search of all the docs? There's a page for that, too.

đŸ“ē Media

More into videos?

I've been lucky enough to be invited on some shows and podcasts here and there: you can find them in the Media section.

A good example is when the fine folks at On .NET invited me on the show to allow me to mumbling random caching stuff.

On .NET Talk

✔ Features

These are the key features of FusionCache:

⭐ Quick Start

FusionCache can be installed via the nuget UI (search for the ZiggyCreatures.FusionCache package) or via the nuget package manager console:

PM> Install-Package ZiggyCreatures.FusionCache

As an example, imagine having a method that retrieves a product from your database:

Product GetProductFromDb(int id) {
	// YOUR DATABASE CALL HERE
}

💡 This is using the sync programming model, but it would be equally valid with the newer async one for even better performance.

To start using FusionCache the first thing is create a cache instance:

var cache = new FusionCache(new FusionCacheOptions());

If instead you are using DI (Dependency Injection) use this:

services.AddFusionCache();

We can also specify some global options, like a default FusionCacheEntryOptions object to serve as a default for each call we'll make, with a duration of 2 minutes and a Low priority:

var cache = new FusionCache(new FusionCacheOptions() {
	DefaultEntryOptions = new FusionCacheEntryOptions {
		Duration = TimeSpan.FromMinutes(2),
		Priority = CacheItemPriority.Low
	}
});

Or, using DI, like this:

services.AddFusionCache()
	.WithDefaultEntryOptions(new FusionCacheEntryOptions {
		Duration = TimeSpan.FromMinutes(2),
		Priority = CacheItemPriority.Low
	})
;

Now, to get the product from the cache and, if not there, get it from the database in an optimized way and cache it for 30 sec simply do this:

var id = 42;

cache.GetOrSet<Product>(
	$"product:{id}",
	_ => GetProductFromDb(id),
	TimeSpan.FromSeconds(30)
);

That's it 🎉

đŸ–Ĩī¸ Simulator

Distributed systems are, in general, quite complex to understand.

When using FusionCache with the distributed cache, the backplane and auto-recovery the Simulator can help us seeing the whole picture.

FusionCache Simulator

🧰 Supported Platforms

FusionCache targets .NET Standard 2.0 so any compatible .NET implementation is fine: this means .NET Framework (the old one), .NET Core 2+ and .NET 5/6+ (the new ones), Mono 5.4+ and more (see here for a complete rundown).

NOTE: if you are running on .NET Framework 4.6.1 and want to use .NET Standard packages Microsoft suggests to upgrade to .NET Framework 4.7.2 or higher (see the .NET Standard Documentation) to avoid some known dependency issues.

đŸ’ŧ Is it Production Ready â„ĸī¸ ?

Yes!

FusionCache is being used in production on real world projects for years, happily handling millions of requests.

Considering that the FusionCache packages have been downloaded more than 6 million times (thanks everybody!) it may very well be used even more.

And again, if you are using it please ✉ drop me a line, I'd like to know!

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 is compatible. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (24)

Showing the top 5 NuGet packages that depend on ZiggyCreatures.FusionCache:

Package Downloads
ZiggyCreatures.FusionCache.Backplane.StackExchangeRedis

FusionCache backplane for Redis based on the StackExchange.Redis library

ZiggyCreatures.FusionCache.Serialization.NewtonsoftJson

FusionCache serializer based on Newtonsoft Json.NET

ZiggyCreatures.FusionCache.Serialization.SystemTextJson

FusionCache serializer based on System.Text.Json

Auth0Net.DependencyInjection

Dependency Injection, HttpClientFactory & ASP.NET Core extensions for Auth0.NET

ZiggyCreatures.FusionCache.Backplane.Memory

FusionCache in memory backplane, used for testing

GitHub repositories (7)

Showing the top 5 popular GitHub repositories that depend on ZiggyCreatures.FusionCache:

Repository Stars
Azure/data-api-builder
Data API builder provides modern REST and GraphQL endpoints to your Azure Databases and on-prem stores.
neozhu/CleanArchitectureWithBlazorServer
This is a repository for creating a Blazor Server dashboard application following the principles of Clean Architecture
TurnerSoftware/CacheTower
An efficient multi-layered caching system for .NET
ikyriak/IdempotentAPI
A .NET library that handles the HTTP write operations (POST and PATCH) that can affect only once for the given request data and idempotency-key by using an ASP.NET Core attribute (filter).
LANCommander/LANCommander
Version Downloads Last updated
1.4.0 20,052 9/15/2024
1.3.0 105,945 8/4/2024
1.2.0 274,051 6/2/2024
1.2.0-preview1 737 5/19/2024
1.1.0 125,940 4/24/2024
1.0.0 202,119 2/29/2024
1.0.0-preview2 4,281 2/23/2024
1.0.0-preview1 1,234 2/11/2024
0.26.0 126,571 2/11/2024
0.25.0 6,681 2/4/2024 0.25.0 is deprecated.
0.25.0-preview1 1,317 1/14/2024
0.24.0 274,791 11/12/2023
0.24.0-preview1 1,914 9/3/2023
0.23.0 337,006 8/1/2023
0.22.0 43,586 7/9/2023
0.21.0 670,772 5/28/2023
0.21.0-preview2 1,802 5/21/2023
0.21.0-preview1 1,763 5/1/2023
0.20.0 148,033 4/8/2023
0.20.0-preview2 1,657 3/29/2023
0.20.0-preview1 1,954 3/3/2023
0.19.0 166,644 2/12/2023
0.18.0 110,730 12/18/2022
0.17.0 18,073 12/4/2022
0.16.0 19,774 11/12/2022
0.15.0 215,207 10/26/2022
0.14.0 10,593 10/18/2022
0.13.0 102,881 8/14/2022
0.12.0 8,534 7/19/2022
0.11.1 2,966 7/15/2022
0.11.0 2,985 7/12/2022
0.10.0 157,081 5/1/2022
0.10.0-preview1 1,638 4/23/2022
0.9.0 67,217 2/17/2022
0.1.10-beta3 3,355 2/14/2022
0.1.10-beta2 1,660 2/11/2022
0.1.10-beta1 1,623 2/9/2022
0.1.10-alpha2 1,699 1/30/2022
0.1.10-alpha1 1,510 1/27/2022
0.1.9 51,415 11/23/2021
0.1.8 7,318 11/23/2021
0.1.7 17,926 10/16/2021
0.1.6 36,360 8/1/2021
0.1.5 5,020 6/29/2021
0.1.4 4,644 6/5/2021
0.1.3 4,217 4/3/2021
0.1.2 14,779 2/26/2021
0.1.1 2,782 1/19/2021
0.1.0 2,712 12/31/2020

- Change: throw specific exception when factory fails without fail-safe
- Fix: entry Size is now being correctly restored from distributed cache
- Add: new observability tags for hit/miss and stale/fresh
- Add: cancellation support for async methods for serializers
- Perf: switched to FrozenDictionary for FusionCacheProvider for better perf
- Perf: added support for RecyclableMemoryStream