feat(dal): Результат работы ShortcodesService весь записывается в Redis
This commit is contained in:
@@ -1,10 +0,0 @@
|
||||
namespace PARR.DAL.DomainServices.Shortcodes.Models
|
||||
{
|
||||
internal class CachedGroupedShortCode
|
||||
{
|
||||
public string Value { get; set; } = string.Empty;
|
||||
public DateTimeOffset Timestamp { get; set; }
|
||||
public string? Source { get; set; } = "ShortcodesService";
|
||||
public int Version { get; set; } = 1;
|
||||
}
|
||||
}
|
||||
@@ -3,13 +3,13 @@ using Microsoft.Extensions.Logging;
|
||||
using PARR.Core.Common.Interfaces;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.DomainModels;
|
||||
using PARR.DAL.DomainServices.Shortcodes.Models;
|
||||
using PARR.DAL.DomainServices.UnitFilterService;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Models.Job;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.DAL.Services.Interfaces.Job;
|
||||
using PARR.DAL.Services.Interfaces.Unit;
|
||||
using PARR.Domain.Cache.Models;
|
||||
using PARR.Domain.Common.Template;
|
||||
using PARR.Domain.Enums;
|
||||
using System.Runtime.CompilerServices;
|
||||
@@ -130,6 +130,19 @@ namespace PARR.DAL.DomainServices.Shortcodes
|
||||
|
||||
var callerName = caller ?? "Unknown";
|
||||
|
||||
// Ключ: shortcodes_result_{TemplateIdN}_{Hash(str)}
|
||||
var cacheKey = cacheService.GetKey(
|
||||
new[] { "shortcodes", "result", template.Id.ToString("N") },
|
||||
new[] { str }
|
||||
);
|
||||
|
||||
var cachedResult = await cacheService.GetCachedDataAsync<ShortcodesResult>(cacheKey).ConfigureAwait(false);
|
||||
if (cachedResult != null)
|
||||
{
|
||||
logger.LogDebug("[{Caller}] Кэш попал для шаблона {TemplateId}", callerName, template.Id);
|
||||
return cachedResult.Data.Result;
|
||||
}
|
||||
|
||||
logger.LogDebug("[{Caller}] Начата подстановка шорткодов. Вход: '{Input}', templateId={TemplateId}", callerName, str, template.Id);
|
||||
|
||||
var result = str;
|
||||
@@ -140,19 +153,29 @@ namespace PARR.DAL.DomainServices.Shortcodes
|
||||
var shortcodes = GetShortCodes(result).Select(m => m.Value).ToList();
|
||||
if (!shortcodes.Any()) break;
|
||||
|
||||
// Подготавливаем данные с догрузкой при необходимости
|
||||
var data = await PrepareTemplateDataAsync(template, shortcodes, callerName).ConfigureAwait(false);
|
||||
|
||||
var oldResult = result;
|
||||
|
||||
// Подстановка всех типов шорткодов
|
||||
result = await ApplyAllShortcodesOnceAsync(result, data, shortcodes, callerName).ConfigureAwait(false);
|
||||
|
||||
iteration++;
|
||||
|
||||
if (result == oldResult) break;
|
||||
}
|
||||
|
||||
// Сохранение в кэш (только если были изменения)
|
||||
if (!string.IsNullOrEmpty(result) && result != str)
|
||||
{
|
||||
var toCache = new ShortcodesResult
|
||||
{
|
||||
Data = new ShortcodesResultDto { Result = result },
|
||||
Timestamp = DateTimeOffset.UtcNow,
|
||||
Source = typeof(ShortcodesService).Name
|
||||
};
|
||||
|
||||
await cacheService.SetCachedDataAsync(cacheKey, toCache, TimeSpan.FromMinutes(15)).ConfigureAwait(false);
|
||||
logger.LogDebug("[{Caller}] Результат сохранён в кэш для ключа '{Key}'", callerName, cacheKey);
|
||||
}
|
||||
|
||||
logger.LogDebug("[{Caller}] Подстановка завершена. Результат: '{Result}'", callerName, result);
|
||||
return result;
|
||||
}
|
||||
@@ -772,11 +795,11 @@ namespace PARR.DAL.DomainServices.Shortcodes
|
||||
//var cacheKey = $"gr_shcd_{jobGroupId:N}_{unitId:N}_{ComputeHash(fullShortcode)}";
|
||||
var cacheKey = cacheService.GetKey(new[] { "grouped", "shortcode", $"{jobGroupId:N}", $"{unitId:N}" }, new[] { fullShortcode });
|
||||
|
||||
var cachedData = await cacheService.GetCachedDataAsync<CachedGroupedShortCode>(cacheKey).ConfigureAwait(false);
|
||||
var cachedData = await cacheService.GetCachedDataAsync<GroupedShortcode>(cacheKey).ConfigureAwait(false);
|
||||
if (cachedData != null)
|
||||
{
|
||||
logger.LogDebug("[{Caller}] Кэш попал для GroupedShortCode '{Name}': {Value}", caller, fullShortcode, cachedData.Value);
|
||||
return cachedData.Value;
|
||||
logger.LogDebug("[{Caller}] Кэш попал для GroupedShortCode '{Name}': {Value}", caller, fullShortcode, cachedData.Data.Value);
|
||||
return cachedData.Data.Value;
|
||||
}
|
||||
|
||||
logger.LogDebug("[{Caller}] Кэш промахнут для GroupedShortCode '{Name}'. Запрашиваем из БД.", caller, fullShortcode);
|
||||
@@ -793,14 +816,12 @@ namespace PARR.DAL.DomainServices.Shortcodes
|
||||
// Не кэшируем пустые значения
|
||||
if (!string.IsNullOrEmpty(mostFrequentValue))
|
||||
{
|
||||
var toCache = new CachedGroupedShortCode
|
||||
var toCache = new GroupedShortcode
|
||||
{
|
||||
Value = mostFrequentValue,
|
||||
Data = new GroupedShortcodeDto { Value = mostFrequentValue },
|
||||
Timestamp = DateTimeOffset.UtcNow,
|
||||
Source = typeof(ShortcodesService).Name,
|
||||
Version = 1
|
||||
Source = typeof(ShortcodesService).Name
|
||||
};
|
||||
|
||||
await cacheService.SetCachedDataAsync(cacheKey, toCache, TimeSpan.FromHours(1)).ConfigureAwait(false);
|
||||
return mostFrequentValue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user