TL.Caching.Helpers
0.5.0
dotnet add package TL.Caching.Helpers --version 0.5.0
NuGet\Install-Package TL.Caching.Helpers -Version 0.5.0
<PackageReference Include="TL.Caching.Helpers" Version="0.5.0" />
<PackageVersion Include="TL.Caching.Helpers" Version="0.5.0" />
<PackageReference Include="TL.Caching.Helpers" />
paket add TL.Caching.Helpers --version 0.5.0
#r "nuget: TL.Caching.Helpers, 0.5.0"
#:package TL.Caching.Helpers@0.5.0
#addin nuget:?package=TL.Caching.Helpers&version=0.5.0
#tool nuget:?package=TL.Caching.Helpers&version=0.5.0
⚡ TL.Caching.Helpers
High-performance enterprise caching library for .NET: L1/L2 hybrid cache, zero-cost in-memory fallback, RedLock stampede protection, GZip buffer pooling, and data protection encryption.
Biblioteca corporativa de caching de alta performance para .NET: cache híbrido L1/L2, fallback em memória Custo Zero ($0), proteção contra cache stampede com RedLock, compressão GZip com pooling e criptografia para proteção de dados.
O TL.Caching.Helpers disponibiliza uma camada de cache corporativa completa e de alta vazão para aplicações modernas em .NET 8 e .NET 9. Combina cache local em memória (L1) com cache distribuído resiliente no Redis (L2), proteção anti-stampede via Double-Checked Locking com RedLock, compressão GZip com reciclagem de memória via ArrayPool<byte>.Shared, mitigação de concorrência com TTL Jitter, e proteção de dados com criptografia em repouso.
📦 Instalação
Adicione o pacote ao seu projeto através do .NET CLI:
dotnet add package TL.Caching.Helpers
🚀 Funcionalidades Principais (v0.3.0)
| Funcionalidade | Componentes & Classes | Descrição |
|---|---|---|
| Modo Custo Zero ($0) | MemoryCacheService, AddTlCaching() |
Execução 100% em memória local com IMemoryCache quando Cache:UseRedis == false ou ausente, sem custo de infraestrutura de nuvem. |
| Compressão GZip com ArrayPool | GZipCompressionProvider, ICacheCompression |
Compactação automática de payloads maiores que 1 KB com economia de mais de 60% de banda/RAM e bypass inteligente para payloads < 1 KB. |
| Resiliência de TTL com Jitter | TtlJitterCalculator |
Dispersão pseudo-aleatória de expiração em ±10% a ±15%, impedindo que milhares de chaves expirem no mesmo segundo (Thundering Herd). |
| Double-Checked Locking & Fallback | CacheLockHelper, LockedCacheService |
Lock distribuído restrito a cache miss para recálculo da factory. Leituras e escritas convencionais operam livres de lock, com fallback silencioso caso o Redis caia. |
| Criptografia e Proteção de Dados | AesEncryptionProvider, ICacheEncryption |
Proteção de dados confidenciais (PII, tokens) em nível de aplicação com integridade e limpeza de memória (ZeroMemory). |
| Pipeline Ordenado | CachePayloadPipeline |
Integração sequencial estrita: Serialização → Compressão (GZip) → Criptografia. |
| Particionamento por Regiões | region, InvalidateRegionAsync |
Invalidação atômica de chaves agrupadas por região ou tenant sem comandos bloqueantes globais. |
💡 Exemplos de Configuração e Uso
1. Configuração Declarativa no appsettings.json
Modo Custo Zero ($0) — Execução Local / Testes
{
"Cache": {
"UseRedis": false
}
}
Modo Produção Distribuído com Redis
{
"Cache": {
"UseRedis": true,
"RedisConnectionString": "redis-cluster.internal:6379,ssl=true,abortConnect=false"
}
}
2. Injeção de Dependência no Program.cs
using Caching.Helpers.Extensions;
// Alternância transparente entre Redis e Modo Custo Zero ($0) conforme configuração
builder.Services.AddTlCaching(builder.Configuration);
// Ou registrar explicitamente o Modo Custo Zero em memória:
// builder.Services.AddMemoryCacheService();
// Ou registrar explicitamente o Redis com connection string direta:
// builder.Services.AddRedisCache(builder.Configuration);
3. Proteção contra Cache Stampede com Double-Checked Locking e Jitter
using Caching.Helpers;
using Caching.Helpers.Resilience;
public class CatalogoService
{
private readonly LockedCacheService _cacheService;
public CatalogoService(LockedCacheService cacheService)
{
_cacheService = cacheService;
}
public async Task<List<ProdutoDto>> ObterCatalogoAsync()
{
// Aplica jitter de ±10% a ±15% sobre o tempo base de 30 minutos
var ttlComJitter = TtlJitterCalculator.ApplyJitter(TimeSpan.FromMinutes(30));
return await _cacheService.GetOrSetWithLockAsync(
key: "catalogo:produtos",
factory: async () => await ConsultarBancoDeDadosAsync(),
expiration: ttlComJitter
);
}
private static async Task<List<ProdutoDto>> ConsultarBancoDeDadosAsync()
{
await Task.Delay(100);
return new List<ProdutoDto>
{
new(1, "Notebook Corporativo", 5200.00m),
new(2, "Monitor UltraWide 34\"", 2400.00m)
};
}
}
public record ProdutoDto(int Id, string Nome, decimal Preco);
4. Criptografia e Proteção de Dados em Repouso
using System.Security.Cryptography;
using Caching.Helpers.Compression;
using Caching.Helpers.Pipeline;
using Caching.Helpers.Security;
// Chave simétrica de 256 bits (32 bytes) carregada de cofre de chaves seguro (Key Vault / KMS)
var chaveMestra = Convert.FromBase64String("sua-chave-secreta-em-base64-de-32-bytes=");
var compression = new GZipCompressionProvider();
using var encryption = new AesEncryptionProvider(chaveMestra);
// Configura o pipeline ordenado: GZip -> Criptografia
var pipeline = new CachePayloadPipeline(compression, encryption);
// Serializa, comprime se > 1 KB e cifra com integridade de tag
var payloadCifrado = pipeline.Encode(sessaoUsuario);
// Decifra validando tag (rejeita adulteração), descomprime e deserializa
var sessaoRestaurada = pipeline.Decode<SessaoUsuarioDto>(payloadCifrado);
🏛️ Decisões Arquiteturais e Segurança
Para detalhes sobre governança arquitetural, resiliência, FinOps e modelagem criptográfica:
- 📄 ADR-001: Arquitetura do Ecossistema TL.DataHelpers e Segurança
- 📄 ADR-000: Convenções e Padrões Globais
📄 Licença
Distribuído sob a licença MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Microsoft.Data.Sqlite.Core (>= 9.0.0)
- Microsoft.Extensions.Caching.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Caching.Memory (>= 9.0.0)
- Microsoft.Extensions.Caching.StackExchangeRedis (>= 9.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.0)
- Microsoft.Extensions.DependencyInjection (>= 9.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Options (>= 9.0.0)
- Polly (>= 8.5.0)
- prometheus-net (>= 8.2.1)
- RedLock.net (>= 2.3.2)
-
net9.0
- Microsoft.Data.Sqlite.Core (>= 9.0.0)
- Microsoft.Extensions.Caching.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Caching.Memory (>= 9.0.0)
- Microsoft.Extensions.Caching.StackExchangeRedis (>= 9.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.0)
- Microsoft.Extensions.DependencyInjection (>= 9.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Options (>= 9.0.0)
- Polly (>= 8.5.0)
- prometheus-net (>= 8.2.1)
- RedLock.net (>= 2.3.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.