Cache distribuído local com LiteDB e IDistributedCache no .NET

Introdução

O IDistributedCache é uma interface poderosa da plataforma .NET que permite abstrair o uso de cache distribuído em aplicações web, APIs e serviços. As implementações mais comuns incluem Redis ou SQL Server, mas e quando queremos algo mais leve, local e com persistência?

Neste artigo, apresento a biblioteca CSharpBrasil.Extensions.Caching.LiteDb, uma solução desenvolvida para oferecer caching distribuído local com o banco LiteDB — um banco NoSQL leve e embutido em C#.

Por que usar LiteDB como backend de cache?

  • Sem dependências externas: ideal para aplicações em containers, APIs internas e soluções desktop.
  • Desempenho local otimizado: armazena os dados em um único arquivo .db, com leitura simultânea e escrita isolada por coleção.
  • Controle completo: opções de segurança, rebuild, collation e cache cleanup automático.

Instalação

Instale via NuGet:

1
dotnet add package CSharpBrasil.Extensions.Caching.LiteDb

Configuração da biblioteca

A biblioteca implementa IDistributedCache e pode ser injetada com facilidade em qualquer aplicação .NET via IServiceCollection:

1
2
3
4
5
6
7
8
builder.Services.AddLiteDbDistributedCache(options =>
{
    options.DatabasePath = "cache.db";
    options.CollectionName = "cache";
    options.Password = "sua-senha-opcional";
    options.CleanupInterval = TimeSpan.FromMinutes(10);
    options.EnableAutoCleanup = true;
});

Opções disponíveis

1
2
3
4
5
6
7
8
9
10
11
12
13
public class LiteDbDistributedCacheOptions
{
    public string DatabasePath { get; set; } = "cache.db";
    public string CollectionName { get; set; } = "cache";
    public bool EnableAutoCleanup { get; set; } = true;
    public TimeSpan CleanupInterval { get; set; } = TimeSpan.FromMinutes(10);
    public bool ReadOnly { get; set; } = false;
    public string? Password { get; set; }
    public bool Upgrade { get; set; } = false;
    public bool AutoRebuild { get; set; } = false;
    public long InitialSize { get; set; } = 0;
    public Collation Collation { get; set; } = Collation.Default;
}

Exemplo de uso em API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[ApiController]
[Route("api/cache")]
public class CacheController : ControllerBase
{
    private readonly IDistributedCache _cache;

    public CacheController(IDistributedCache cache)
    {
        _cache = cache;
    }

    [HttpPost("{key}")]
    public async Task<IActionResult> Set(string key, [FromBody] string value)
    {
        await _cache.SetStringAsync(key, value, new DistributedCacheEntryOptions
        {
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
        });
        return Ok();
    }

    [HttpGet("{key}")]
    public async Task<IActionResult> Get(string key)
    {
        var value = await _cache.GetStringAsync(key);
        return Ok(value ?? "(not found)");
    }
}

Exemplo de uso em Console App

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddLiteDbDistributedCache(options =>
        {
            options.DatabasePath = "console-cache.db";
        });
    })
    .Build();

var cache = host.Services.GetRequiredService<IDistributedCache>();

await cache.SetStringAsync("message", "Olá mundo!", new DistributedCacheEntryOptions
{
    AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30)
});

var result = await cache.GetStringAsync("message");
Console.WriteLine($"Mensagem em cache: {result}");

Considerações finais

Essa biblioteca foi pensada para aplicações reais que precisam de caching local performático, com segurança e controle total sobre a persistência dos dados. O LiteDB é uma excelente alternativa quando não se quer depender de um Redis ou infraestrutura externa.

Acesse o código no GitHub e instale o pacote no NuGet para começar a usar agora mesmo!

Participe da nossa comunidade no WhastApp.

Bons estudos e mãos à obra!