From ddd99ec70324467406775165653f26e248d12377 Mon Sep 17 00:00:00 2001 From: Jose Henrique Date: Thu, 11 Sep 2025 20:44:57 -0300 Subject: [PATCH] #34 add size based cache --- OpenCand.API/Program.cs | 18 +++++++++++---- OpenCand.API/Repository/BaseRepository.cs | 28 +++++++++++++++++++++-- OpenCand.API/appsettings.json | 3 +++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/OpenCand.API/Program.cs b/OpenCand.API/Program.cs index 1b726f3..700eb4a 100644 --- a/OpenCand.API/Program.cs +++ b/OpenCand.API/Program.cs @@ -36,7 +36,8 @@ namespace OpenCand.API { FileProvider = new PhysicalFileProvider(Path.Combine(workingDir, "fotos_cand")), RequestPath = "/assets/fotos" - }); app.UseHttpsRedirection(); + }); + app.UseHttpsRedirection(); // Use rate limiting middleware app.UseRateLimiter(); @@ -53,11 +54,18 @@ namespace OpenCand.API app.Run(); } - private static void SetupServices(WebApplicationBuilder builder) + + private static void SetupServices(WebApplicationBuilder builder) { builder.Services.Configure(builder.Configuration.GetSection("FotosSettings")); - builder.Services.AddMemoryCache(); - + + // Configure memory cache with size limit from appsettings + var sizeLimitMB = builder.Configuration.GetValue("CacheSettings:SizeLimitMB", 15); + builder.Services.AddMemoryCache(options => + { + options.SizeLimit = sizeLimitMB * 1024L * 1024L; // Convert MB to bytes + }); + builder.Services.AddScoped(provider => new OpenCandRepository(provider.GetRequiredService(), provider.GetService())); builder.Services.AddScoped(provider => new CandidatoRepository(provider.GetRequiredService(), provider.GetService())); builder.Services.AddScoped(provider => new BemCandidatoRepository(provider.GetRequiredService(), provider.GetService())); @@ -66,7 +74,7 @@ namespace OpenCand.API builder.Services.AddScoped(); builder.Services.AddScoped(); - + // Add cache preload background service builder.Services.AddHostedService(); } diff --git a/OpenCand.API/Repository/BaseRepository.cs b/OpenCand.API/Repository/BaseRepository.cs index 1a65ca5..84a85d1 100644 --- a/OpenCand.API/Repository/BaseRepository.cs +++ b/OpenCand.API/Repository/BaseRepository.cs @@ -1,5 +1,7 @@ using Microsoft.Extensions.Caching.Memory; using Npgsql; +using System.Text.Json; +using System.Text; namespace OpenCand.Repository { @@ -56,7 +58,8 @@ namespace OpenCand.Repository _cache.Set(cacheKey, result, new MemoryCacheEntryOptions { SlidingExpiration = expiration ?? DefaultCacheExpiration, - Priority = priority ?? DefaultCachePriority + Priority = priority ?? DefaultCachePriority, + Size = EstimateSize(result) }); } @@ -99,7 +102,8 @@ namespace OpenCand.Repository _cache.Set(cacheKey, result, new MemoryCacheEntryOptions { SlidingExpiration = expiration ?? DefaultCacheExpiration, - Priority = priority ?? DefaultCachePriority + Priority = priority ?? DefaultCachePriority, + Size = EstimateSize(result) }); } @@ -133,5 +137,25 @@ namespace OpenCand.Repository { return identifier != null ? $"{entityName}_{identifier}" : entityName; } + + /// + /// Estimates the memory size of an object by serializing it to JSON + /// + /// Type of the object + /// The object to estimate size for + /// Estimated size in bytes + private static long EstimateSize(T obj) + { + if (obj == null) return 0; + try + { + var json = JsonSerializer.Serialize(obj); + return Encoding.UTF8.GetByteCount(json); + } + catch + { + return 1024; // Default estimate if serialization fails + } + } } } diff --git a/OpenCand.API/appsettings.json b/OpenCand.API/appsettings.json index af09ff0..99ac803 100644 --- a/OpenCand.API/appsettings.json +++ b/OpenCand.API/appsettings.json @@ -12,5 +12,8 @@ "Path": "./fotos_cand", "ApiBasePath": "http://localhost:5299/assets/fotos" }, + "CacheSettings": { + "SizeLimitMB": 15 + }, "AllowedHosts": "*" }