
Si te pidiera que me hablaras de la caché, si fueras un desarrollador backend me hablarías de Redis, mientras que si fueras un desarrollador frontend seguramente me dirías “ese maldito mecanismo por el que tengo que presionar ctrl f5 para ver mis cambios en el navegador”.
Yo, en cambio, hoy estoy aquí para hablarte de un tipo de caché «amigable para desarrolladores», una caché híbrida para proyectos .Net.
Bienvenidos a OpenDev Explorer, mi sección dedicada a explorar el mundo del Open Source con un enfoque especial en la experiencia del desarrollador. Soy Riccardo (también conocido como TheZal), y hoy les hablaré de FusionCache, una biblioteca que les permitirá gestionar de forma híbrida la caché en sus proyectos .NET. Si quieres ver todos los artículos de esta sección podrás leerlos en italiano aquí
Tabla de contenidos
Panorámica General

FusionCache es una caché híbrida diseñada para ser fácil de usar, rápida y resiliente, con funciones avanzadas de gestión de errores.
Nace de la experiencia acumulada a lo largo de los años enfrentando los más diversos tipos de caché: desde la caché en memoria hasta la distribuida, desde la caché HTTP hasta las CDN, e incluso la caché offline y la del navegador.
FusionCache, siendo una caché híbrida, puede funcionar de manera transparente tanto como caché en memoria (L1) como caché multi-nivel (L1+L2). En este segundo caso, el nivel distribuido (L2) puede ser cualquier implementación de la interfaz estándar IDistributedCache. Este enfoque ofrece arranques en frío más rápidos, mejor escalabilidad horizontal, mayor resiliencia y un rendimiento global superior.
Manual de instrucciones
Instalación
Instalar FusionCache es muy sencillo, ya que está disponible como paquete en NuGet. Se puede instalar tanto a través de la interfaz de usuario de NuGet (buscando el paquete ZiggyCreatures.FusionCache) como mediante la consola de NuGet con el siguiente comando:
PM> Install-Package ZiggyCreatures.FusionCache
Uso
Para empezar a usar FusionCache, lo primero que debes hacer es crear una instancia de caché:
var cache = new FusionCache(new FusionCacheOptions());
Si estás utilizando Dependency Injection, solo necesitas agregar esta línea:
services.AddFusionCache();
También es posible configurar opciones globales, como por ejemplo un objeto FusionCacheEntryOptions predeterminado con una duración de 2 minutos para cada operación que realices:
var cache = new FusionCache(new FusionCacheOptions() {
DefaultEntryOptions = new FusionCacheEntryOptions {
Duration = TimeSpan.FromMinutes(2)
}
});
O, siempre a través de Dependency Injection:
services.AddFusionCache()
.WithDefaultEntryOptions(new FusionCacheEntryOptions {
Duration = TimeSpan.FromMinutes(2)
});
Code language: JavaScript (javascript)
Ahora, para obtener un producto de la caché y, si no está presente, recuperarlo de la base de datos de manera optimizada y guardarlo en la caché durante 30 segundos (sobrescribiendo los 2 minutos predeterminados mencionados anteriormente), basta con hacer lo siguiente:
var id = 42;
cache.GetOrSet<Product>(
$"product:{id}",
_ => GetProductFromDb(id),
TimeSpan.FromSeconds(30)
);
Code language: PHP (php)
La experiencia del desarrollador

La simplicidad de uso de FusionCache lo convierte en un proyecto muy atractivo en cuanto a la experiencia del desarrollador, teniendo entre sus principales ventajas su facilidad de implementación y el hecho de ser un proyecto listo para producción desde el primer momento.
Además, FusionCache cuenta en su documentación con varios recursos muy útiles para el arranque inicial, lo que permite tener una curva de aprendizaje relativamente baja.
También, dado que el autor del proyecto se dio cuenta de que a veces visualizar un sistema distribuido es la mejor forma de entenderlo, implementó un simulador que permite comprender cómo funciona FusionCache.
El esfuerzo adicional

El esfuerzo adicional de FusionCache se debe sin duda al sistema de autorrecovery, que permite recuperar la salud de nuestro sistema de caché en caso de mal funcionamiento.
En caso de problemas transitorios con los componentes distribuidos (como la caché distribuida o el backplane), FusionCache intentará resolverlos automáticamente, sin necesidad de intervención alguna.
El autorrecovery puede ser profundizado aquí.
La comparación con el estado actual
Existen innumerables bibliotecas que se encargan de la gestión de caché en circulación, pero para hacer una comparación directa, en el repositorio oficial del proyecto se puede encontrar la siguiente tabla que resume las diferencias con otras bibliotecas.
FusionCache | HybridCache | CacheManager | CacheTower | EasyCaching | LazyCache | |
Cache Stampede | ✔ | ✔ | ❌ | ✔ | ✔ | ✔ |
Sync Api | ✔ | ❌ | ✔ | ❌ | ✔ | ✔ |
Async Api | ✔ | ✔ | ❌ | ✔ | ✔ | ! |
Fail-Safe | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ |
Timeouts | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ |
Adaptive caching | ✔ | ❌ | ❌ | ❌ | ❌ | ✔ |
Cancellation | ✔ | ✔ | ❌ | ❌ | ❌ | ❌ |
Multi provider | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
Multi level | ✔ | ✔ | ✔ | ✔ | ! | ❌ |
Backplane | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
Auto recovery | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ |
Events | ✔ | ❌ | ✔ | ❌ | ❌ | ❌ |
Open Telemetry | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ |
Logging | ✔ | ❌ | ✔ | ❌ | ✔ | ❌ |
Portable | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
Tests | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
Xml Comments | ✔ | ❌ | ✔ | ✔ | ✔ | ❌ |
Docs | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
License | MIT | Same as .net | Apache 2.0 | MIT | MIT | MIT |
¡Hagamos un resumen!
Considero que FusionCache es uno de los proyectos más interesantes que he tenido la oportunidad de conocer en Codemotion 2024, tanto por lo que respecta a su experiencia del desarrollador como por las potencialidades del proyecto, que se evidencian también en el hecho de que
Microsoft ha decidido implementar su HybridCache siguiendo los mismos pasos de FusionCache.