Cache management refinement

This commit is contained in:
Samuele Locatelli
2021-05-20 18:08:55 +02:00
parent b826a6759a
commit eeb5e12bf0
4 changed files with 102 additions and 54 deletions
+34 -11
View File
@@ -24,6 +24,19 @@ namespace MP.Stats.Data
private readonly IDistributedCache distributedCache;
private readonly IMemoryCache memoryCache;
private DistributedCacheEntryOptions cacheOpt;
/// <summary>
/// Durata assoluta massima della cache
/// </summary>
private int chAbsExp = 15;
/// <summary>
/// Durata della cache in modalità inattiva (non acceduta) prima di venire rimossa
/// NON estende oltre il tempo massimo di validità Abs della cache
/// </summary>
private int chSliExp = 5;
#endregion Private Fields
#region Protected Fields
@@ -45,8 +58,11 @@ namespace MP.Stats.Data
{
_logger = logger;
_configuration = configuration;
// conf cache
this.memoryCache = memoryCache;
this.distributedCache = distributedCache;
cacheOpt = new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp));
// conf DB
string connStr = _configuration.GetConnectionString("Mp.Stats");
if (string.IsNullOrEmpty(connStr))
{
@@ -64,6 +80,16 @@ namespace MP.Stats.Data
#endregion Public Constructors
#region Protected Methods
protected string getCacheKey(string TableName, SelectData CurrFilter)
{
string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:A_{CurrFilter.CodArticolo}:K_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyyyMMddHHmm}_{CurrFilter.DateEnd:yyyyMMddHHmm}";
return answ;
}
#endregion Protected Methods
#region Public Methods
public Task<MP.Data.DatabaseModels.AzioniUL[]> ActionsGetAll()
@@ -112,26 +138,23 @@ namespace MP.Stats.Data
return await Task.FromResult(dbController.StatTurniOeeGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo));
}
public async Task<List<MP.Data.DatabaseModels.TurniOee>> StatTurniOeeGetAllCached(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo, string searchVal = "")
public async Task<List<MP.Data.DatabaseModels.TurniOee>> StatTurniOeeGetAllCached(SelectData CurrFilter, string searchVal = "")
{
List<MP.Data.DatabaseModels.TurniOee> dbResult = new List<MP.Data.DatabaseModels.TurniOee>();
var cacheKey = "oeeData";
string cacheKey = getCacheKey("MP:STATS:OEE", CurrFilter);
string rawData;
var redisCustomerList = await distributedCache.GetAsync(cacheKey);
if (redisCustomerList != null)
var redisDataList = await distributedCache.GetAsync(cacheKey);
if (redisDataList != null)
{
rawData = Encoding.UTF8.GetString(redisCustomerList);
rawData = Encoding.UTF8.GetString(redisDataList);
dbResult = JsonConvert.DeserializeObject<List<MP.Data.DatabaseModels.TurniOee>>(rawData);
}
else
{
dbResult = dbController.StatTurniOeeGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo);
dbResult = dbController.StatTurniOeeGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo);
rawData = JsonConvert.SerializeObject(dbResult);
redisCustomerList = Encoding.UTF8.GetBytes(rawData);
var options = new DistributedCacheEntryOptions()
.SetAbsoluteExpiration(DateTime.Now.AddMinutes(10))
.SetSlidingExpiration(TimeSpan.FromMinutes(2));
await distributedCache.SetAsync(cacheKey, redisCustomerList, options);
redisDataList = Encoding.UTF8.GetBytes(rawData);
await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt);
}
return await Task.FromResult(dbResult);
}