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);
}
+19
View File
@@ -20,6 +20,25 @@ namespace MP.Stats.Data
#region Public Methods
/// <summary>
/// Inizializzazione con periodo e arrotondamento
/// </summary>
/// <param name="minRound"></param>
/// <param name="numDayPrev"></param>
/// <returns></returns>
public static SelectData Init(int minRound, int numDayPrev)
{
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today);
int minDay = (int)(DayElapsed.TotalMinutes / minRound) * minRound;
DateTime endRounded = DateTime.Today.AddMinutes(minDay);
SelectData answ = new SelectData()
{
DateEnd = endRounded,
DateStart = endRounded.AddDays(-numDayPrev)
};
return answ;
}
public override bool Equals(object obj)
{
if (!(obj is SelectData item))
+47 -42
View File
@@ -14,55 +14,60 @@
<div class="card-body py-0">
@if (currRecord != null)
{
@*<BasketEditor Basket="@currBasket" DataReset="ResetData" DataUpdated="UpdateData"></BasketEditor>*@
@*<BasketEditor Basket="@currBasket" DataReset="ResetData" DataUpdated="UpdateData"></BasketEditor>*@
}
@if (totalCount == 0 || ListRecords == null || ListRecords.Count() == 0)
{
<div class="progress-bar progress-bar-striped progress-bar-animated" style="width:70%"></div>
<div class="row">
<div class="col-12 text-center py-3">
<h3>loading data</h3>
<i class="fas fa-spinner fa-spin fa-5x"></i>
</div>
</div>
}
else
{
<div class="row">
<div class="col-12 table-secondary">
<SelectionFilter SelFilter="currFilter" filterChanged="DoFilter"></SelectionFilter>
</div>
<div class="col-12">
<table class="table table-sm table-striped">
<thead>
<tr>
@*<th></th>*@
<th>Data</th>
<th>Turno</th>
<th>Macchina</th>
<th>Articolo</th>
<th class="text-right">Durata</th>
<th class="text-right">Pezzi</th>
<th class="text-right">OEE %</th>
</tr>
</thead>
<tbody>
@foreach (var record in ListRecords)
{
<tr class="@checkSelect(record.DataRif, record.Turno, @record.IdxMacchina)">
@*<td><button class="btn btn-sm btn-info" @onclick="() => Edit(record)"><span class="oi oi-pencil"></span></button>&nbsp;<button class="btn btn-sm btn-success" @onclick="() => ShowDocs(record)" title="Vai ai documenti"><span class="oi oi-document"></span></button></td>*@
<td>
<div>@record.DataRif.ToString("yyyy.MM.dd")</div>
</td>
<td>@record.Turno</td>
<td>
<div>@record.CodMacchina</div>
<div class="small">@record.IdxMacchina</div>
</td>
<td>@record.CodArticolo</td>
<td class="text-right">@record.TotPeriodo.ToString("N2")</td>
<td class="text-right">@record.TotPz</td>
<td class="text-right">@record.OEE.ToString("P2")</td>
</tr>
}
</tbody>
</table>
</div>
<div class="row">
<div class="col-12 table-secondary">
<SelectionFilter SelFilter="currFilter" filterChanged="DoFilter"></SelectionFilter>
</div>
<div class="col-12">
<table class="table table-sm table-striped">
<thead>
<tr>
@*<th></th>*@
<th>Data</th>
<th>Turno</th>
<th>Macchina</th>
<th>Articolo</th>
<th class="text-right">Durata</th>
<th class="text-right">Pezzi</th>
<th class="text-right">OEE %</th>
</tr>
</thead>
<tbody>
@foreach (var record in ListRecords)
{
<tr class="@checkSelect(record.DataRif, record.Turno, @record.IdxMacchina)">
@*<td><button class="btn btn-sm btn-info" @onclick="() => Edit(record)"><span class="oi oi-pencil"></span></button>&nbsp;<button class="btn btn-sm btn-success" @onclick="() => ShowDocs(record)" title="Vai ai documenti"><span class="oi oi-document"></span></button></td>*@
<td>
<div>@record.DataRif.ToString("yyyy.MM.dd")</div>
</td>
<td>@record.Turno</td>
<td>
<div>@record.CodMacchina</div>
<div class="small">@record.IdxMacchina</div>
</td>
<td>@record.CodArticolo</td>
<td class="text-right">@record.TotPeriodo.ToString("N2")</td>
<td class="text-right">@record.TotPz</td>
<td class="text-right">@record.OEE.ToString("P2")</td>
</tr>
}
</tbody>
</table>
</div>
</div>
}
</div>
<div class="card-footer py-1">
+2 -1
View File
@@ -61,7 +61,7 @@ namespace MP.Stats.Pages
private async Task reloadData()
{
SearchRecords = await StatService.StatTurniOeeGetAllCached(currFilter.DateStart, currFilter.DateEnd, currFilter.IdxMacchina, currFilter.IdxOdl, currFilter.KeyRichiesta, currFilter.CodArticolo, MessageService.SearchVal);
SearchRecords = await StatService.StatTurniOeeGetAllCached(currFilter, MessageService.SearchVal);
//SearchRecords = await StatService.StatTurniOeeGetAll(currFilter.DateStart, currFilter.DateEnd, currFilter.IdxMacchina, currFilter.IdxOdl, currFilter.KeyRichiesta, currFilter.CodArticolo, MessageService.SearchVal);
ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToArray();
}
@@ -91,6 +91,7 @@ namespace MP.Stats.Pages
protected override async Task OnInitializedAsync()
{
numRecord = 10;
currFilter = SelectData.Init(5, 7);
MessageService.ShowSearch = true;
MessageService.EA_SearchUpdated += OnSeachUpdated;
await reloadData();