Saltar al contenido principal

Invalidación de Caché

Usa IInvalidatesCache en cualquier solicitud para invalidar automáticamente entradas de caché cuando la solicitud se procesa.

Invalidación por Clave

public record UpdateProductCommand(Guid Id, string Name, decimal Price)
: IRequest<Result>, IInvalidatesCache
{
// Invalida la entrada cacheada del producto específico
public IEnumerable<string> InvalidatedKeys => new[] { $"product:{Id}" };
public IEnumerable<string> InvalidatedGroups => Enumerable.Empty<string>();
}

Invalidación por Grupo

public record CreateProductCommand(string Name, decimal Price, string Category)
: IRequest<Result<Guid>>, IInvalidatesCache
{
// Un nuevo producto significa que todas las páginas de listas de productos están obsoletas
public IEnumerable<string> InvalidatedKeys => Enumerable.Empty<string>();
public IEnumerable<string> InvalidatedGroups => new[] { "products" };
}

Invalidación Combinada

public record DeleteProductCommand(Guid Id)
: IRequest<Result>, IInvalidatesCache
{
public IEnumerable<string> InvalidatedKeys => new[]
{
$"product:{Id}",
$"product-details:{Id}",
};

public IEnumerable<string> InvalidatedGroups => new[]
{
"products",
"featured-products",
};
}

Temporalidad de la Invalidación

La invalidación de caché se ejecuta después de que el handler ejecute exitosamente. Si el handler falla, la caché NO se invalida.

loading...

Patrón Write-Through Completo

// Consulta — cacheada
public record GetProductQuery(Guid Id) : IRequest<Result<ProductDto>>, ICacheable
{
public string CacheKey => $"product:{Id}";
public TimeSpan? AbsoluteExpiration => TimeSpan.FromMinutes(30);
public TimeSpan? SlidingExpiration => null;
public string? CacheGroup => "products";
public bool BypassCache => false;
public CacheOrder Order => CacheOrder.CheckThenStore;
}

// Comando — invalida
public record UpdateProductCommand(Guid Id, string Name, decimal Price)
: IRequest<Result>, IInvalidatesCache
{
public IEnumerable<string> InvalidatedKeys => new[] { $"product:{Id}" };
public IEnumerable<string> InvalidatedGroups => new[] { "products" };
}
Convención de Nomenclatura de Claves

Usa un formato de clave consistente entre consultas y comandos de invalidación. Un buen patrón es tipo-entidad:id (ej. product:42, user:profile:100).