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.