In-memory and distributed caching abstraction for .NET. Unified API across memory and Redis backends, with stampede protection, TTL policies, cache-aside pattern, and stale-while-revalidate support — designed for high-throughput services where cache misses are expensive.
- Unified API — Same interface for in-memory and distributed backends; swap providers without code changes
- Stampede Protection — Lock-based cache population prevents thundering herd on cold keys
- Stale-While-Revalidate — Serve stale data while refreshing in the background; never block on cache miss
- TTL Policies — Absolute and sliding expiration with per-key and per-category defaults
- Cache-Aside — Built-in
GetOrSetAsyncwith factory delegate for clean cache-aside patterns - Serialization — Pluggable serialization (System.Text.Json default, MessagePack optional)
- Tagging — Tag cache entries for bulk invalidation (e.g., invalidate all entries tagged "user:123")
- Metrics — Hit/miss counters, eviction tracking, and cache size reporting
- Single Registration —
services.AddCacheKit()
dotnet add package JG.CacheKitbuilder.Services.AddCacheKit(options =>
{
options.UseMemory(); // In-memory for dev
// options.UseDistributed(); // Use with any registered IDistributedCache
options.DefaultTtl = TimeSpan.FromMinutes(5);
options.EnableStampedeProtection = true;
});
// Usage
public class ProductService(ICacheKit cache)
{
public async Task<Product> GetProductAsync(string id) =>
await cache.GetOrSetAsync(
$"product:{id}",
async ct => await LoadProductAsync(id, ct),
new CacheEntryOptions { Ttl = TimeSpan.FromMinutes(10) });
}- API Reference — Full API documentation and examples
Contributions are welcome! Please feel free to submit a Pull Request.
Licensed under the Apache License 2.0. See LICENSE for details.
Ready to get started? Install via NuGet and check out the API reference.