using Microsoft.Extensions.Configuration; using MP.Data.Conf; using MP.Data.DatabaseModels; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MP.Data.Services { /// /// Classe accesso dati filtrati per operatore /// public class ListSelectDataSrv : BaseServ, IDisposable { #region Public Constructors public ListSelectDataSrv(IConfiguration configuration) { _configuration = configuration; // setup compoenti REDIS redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis")); redisDb = redisConn.GetDatabase(); // conf DB string connStr = _configuration.GetConnectionString("Mp.All"); if (string.IsNullOrEmpty(connStr)) { Log.Error("ConnString empty!"); } else { StringBuilder sb = new StringBuilder(); dbController = new Controllers.MpSpecController(configuration); sb.AppendLine($"ListSelectDataSrv | MpSpecController OK"); Log.Info(sb.ToString()); } } #endregion Public Constructors #region Public Properties public static Controllers.MpSpecController dbController { get; set; } = null!; #endregion Public Properties #region Public Methods /// /// Elenco tabella Articoli da filtro /// /// Numero record max da recuperare /// cod azienda, * = tutte /// Ricerca testuale /// public async Task> ArticoliGetSearch(int numRecord, string azienda, string searchVal) { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:Art:{azienda}:{searchVal}:{numRecord}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = await Task.FromResult(dbController.ArticoliGetSearch(numRecord, azienda, searchVal)); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"ArticoliGetSearch | azienda: {azienda} | searchVal: {searchVal} | numRecord: {numRecord} | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public Task> ConfigGetAll() { return Task.FromResult(dbController.ConfigGetAll().ToList()); } public void Dispose() { // Clear database controller dbController.Dispose(); } /// /// Pulizia cache Redis (tutta) /// /// public async Task FlushCache() { RedisValue pattern = new RedisValue($"{redisBaseKey}:*"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } /// /// Pulizia cache Redis per chiave specifica (da redisBaseKey...) /// /// public async Task FlushCache(string KeyReq) { RedisValue pattern = new RedisValue($"{redisBaseKey}:{KeyReq}:*"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } /// /// Elenco link JQM dato filtro tipo /// /// /// public async Task> ListLinkFilt(string tipoLink) { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:Menu:{tipoLink}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = await Task.FromResult(dbController.ListLinkFilt(tipoLink)); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"ListLinkFilt | tipoLink: {tipoLink} | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Elenco link JQM (totale) /// /// public async Task> ListLinkAll() { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:Menu:ALL"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = await Task.FromResult(dbController.ListLinkAll()); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"ListLinkAll | tipoLink: * | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Elenco Macchine dato operatore secondo gruppi (macchine/operatore) /// /// /// public async Task> MacchineByMatrOper(int MatrOpr) { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:Macc:{MatrOpr}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = await Task.FromResult(dbController.MacchineByMatrOper(MatrOpr)); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"MacchineGetFilt | MatrOpr: {MatrOpr} | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } #endregion Public Methods #region Protected Fields /// /// Oggetto per connessione a REDIS /// protected ConnectionMultiplexer redisConn = null!; /// /// Oggetto DB redis da impiegare x chiamate R/W /// protected IDatabase redisDb = null!; #endregion Protected Fields #region Private Fields private static Logger Log = LogManager.GetCurrentClassLogger(); private string redisBaseKey = "MP:ALL:Cache"; #endregion Private Fields #region Private Methods /// /// Esegue flush memoria redis dato pattern /// /// /// private async Task ExecFlushRedisPattern(RedisValue pattern) { bool answ = false; var listEndpoints = redisConn.GetEndPoints(); foreach (var endPoint in listEndpoints) { //var server = redisConnAdmin.GetServer(listEndpoints[0]); var server = redisConn.GetServer(endPoint); if (server != null) { var keyList = server.Keys(redisDb.Database, pattern); foreach (var item in keyList) { await redisDb.KeyDeleteAsync(item); } answ = true; } } return answ; } #endregion Private Methods } }