using Microsoft.AspNetCore.Mvc;
using ZiggyCreatures.Caching.Fusion;
namespace FusionCacheExample.Controllers
{
(Route("api/(controller)"))
(ApiController)
public class ProductController : ControllerBase
{
private readonly IProductRepository _productRepository;
private readonly IFusionCache _fusionCache;
public ProductController(IFusionCache fusionCache,
IProductRepository productRepository)
{
_fusionCache = fusionCache;
_productRepository = productRepository;
}
(HttpGet("{productId}"))
public async Task GetProductById(int productId)
{
var cacheKey = $"product_{productId}";
var cachedProduct = await _fusionCache.GetOrSetAsync
(cacheKey, async () =>
{
return await _productRepository.GetProductById(productId);
},
options =>
options
.SetDuration(TimeSpan.FromMinutes(2))
.SetFailSafe(true)
);
if (cachedProduct == null)
{
return NotFound();
}
return Ok(cachedProduct);
}
}
}
Suporte para atualização rápida no FusionCache
O FusionCache inclui um ótimo recurso chamado eager refresh que pode ajudar você a manter seu cache atualizado com os dados mais recentes, garantindo a responsividade ao mesmo tempo. Ao habilitar esse recurso, você pode especificar uma duração personalizada para seus dados em cache e também um limite de porcentagem, conforme mostrado no snippet de código abaixo.
options => options.SetDuration(TimeSpan.FromMinutes(1))
options => options.SetEagerRefresh(0.5f)
Observe como a duração do cache foi definida para 1 minuto, enquanto o limite de atualização ansiosa é definido para 50% da duração do cache. Quando uma nova solicitação chega e seus dados em cache são mais antigos que 50% da duração do cache (ou seja, após 31 segundos), o FusionCache retornará os dados em cache e atualizará o cache em segundo plano para garantir que o cache seja atualizado.