Easy.Cache is a lightweight, high-performance caching library for .NET that supports MemoryCache, Redis, and multi-layer caching with pluggable serialization.
It is designed with Enterprise Best Practices in mind, offering full async/await support with CancellationToken, strong typing, and modular architecture.
async/await and CancellationToken to prevent wasted resources on cancelled requests.IServiceCollection).Abstractions, Providers, and Serializers namespaces for cleaner architecture..NET 10, .NET 8, .NET 6, .NET Standard 2.0/2.1, and .NET Framework 4.7.2+.Install via NuGet Package Manager:
Install-Package Easy.CacheOr via .NET CLI:
dotnet add package Easy.CacheRegister the caching strategy you need in your Program.cs.
using Easy.Cache; // Core Namespace
var builder = WebApplication.CreateBuilder(args);
// Option A: In-Memory Cache (Single Server)
builder.Services.AddEasyCacheMemory();
// Option B: Redis Cache (Distributed)
builder.Services.AddEasyCacheRedis("localhost:6379,password=...");
// Option C: Multi-Layer Cache (Best of Both Worlds)
// Reads from Memory first (fast), falls back to Redis (reliable).
builder.Services.AddEasyCacheMultiLayer("localhost:6379,password=...");
var app = builder.Build();Inject CacheManager into your controllers or services.
using Easy.Cache;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
private readonly CacheManager _cache;
public ProductsController(CacheManager cache)
{
_cache = cache;
}
[HttpGet("{id}")]
public async Task<IActionResult> GetProduct(int id, CancellationToken cancellationToken)
{
string cacheKey = $"product:{id}";
// 1. Try to get from cache
var product = await _cache.GetAsync<Product>(cacheKey, cancellationToken);
if (product != null)
{
return Ok(product); // Hit!
}
// 2. If not found, fetch from DB (Simulated)
product = new Product { Id = id, Name = "Smartphone", Price = 999 };
// 3. Set to cache
// Absolute Expiration: 10 minutes (Removed after 10m)
// Sliding Expiration: 2 minutes (Reset timer if accessed within 2m)
await _cache.SetAsync(
cacheKey,
product,
absoluteExpiration: TimeSpan.FromMinutes(10),
slidingExpiration: TimeSpan.FromMinutes(2),
cancellationToken: cancellationToken
);
return Ok(product);
}
[HttpDelete("{id}")]
public async Task<IActionResult> RemoveProduct(int id, CancellationToken cancellationToken)
{
await _cache.RemoveAsync($"product:{id}", cancellationToken);
return NoContent();
}
}| Provider | Absolute Expiration | Sliding Expiration | Note |
|---|---|---|---|
| MemoryCache | ✅ Supported | ✅ Supported | Full support for both strategies. |
| Redis | ✅ Supported | ❌ Not Supported | Redis native "TTL" is used as Absolute Expiration. |
Export to Sheets
Note: If
absoluteExpirationandslidingExpirationare both null, the cache entry will remain indefinitely until manually removed or evicted by memory pressure.
The library follows a clean separation of concerns:
Easy.Cache.Abstractions: Interfaces (ICacheProvider, ISerializer). Use this namespace if you are building libraries that depend on Easy.Cache.
Easy.Cache.Providers: Concrete implementations (RedisCacheProvider, MemoryCacheProvider, MultiLayerCacheProvider).
Easy.Cache.Serializers: Serialization logic (JsonCacheSerializer).
Easy.Cache: The main entry point (CacheManager, ServiceCollectionExtensions).
Contributions and suggestions are welcome. Please open an issue or submit a pull request.
For questions, contact us via elmin.alirzayev@gmail.com or GitHub.
This project is licensed under the MIT License.
© 2025 Elmin Alirzayev / Easy Code Tools