feat(dal): RedisCacheService - обновлен метод GetKey, теперь гибкая генерация с hash

This commit is contained in:
Mikhail Trubnikov
2026-03-20 12:28:34 +10:00
parent f75dca0a3b
commit 42ac353198
4 changed files with 24 additions and 15 deletions

View File

@@ -54,8 +54,8 @@
/// Сгенерировать уникальный ключ
/// </summary>
/// <param name="keyParts"></param>
/// <param name="isUseHash"></param>
/// <param name="keyPartsToHash"></param>
/// <returns></returns>
string GetKey(string[] keyParts, bool isUseHash = false);
string GetKey(string[] keyParts, string[]? keyPartsToHash = null);
}
}

View File

@@ -70,25 +70,33 @@ namespace PARR.DAL.Cache.Services.Base
}
public string GetKey(string[] keyParts, bool isUseHash = false)
public string GetKey(string[] keyParts, string[]? keyPartsToHash = null)
{
// разделитель между ИД
var mainSeparator = "_";
// разделитель между словами
var wordSeparator = "-";
if (keyParts.Length == 0)
{
throw new ArgumentNullException("keyParts не может быть пустым");
}
var keyStr = string.Join("_", keyParts);
var keyStr = string.Join(mainSeparator, keyParts).Replace(" ", wordSeparator);
if (isUseHash)
if (keyPartsToHash != null && keyPartsToHash.Length > 0)
{
using var sha256 = System.Security.Cryptography.SHA256.Create();
var hashedBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(keyStr));
var partsToHashStr = string.Join(mainSeparator, keyPartsToHash).Replace(" ", wordSeparator);
// return Convert.ToBase64String(hashedBytes).Replace('+', '-').Replace('/', '_').Substring(0, 16);
return Convert.ToBase64String(hashedBytes).Substring(0, 16);
using var sha256 = System.Security.Cryptography.SHA256.Create();
var hashedBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(partsToHashStr));
var base64str = Convert.ToBase64String(hashedBytes).Substring(0, 16);
return (keyStr + mainSeparator + base64str).ToLower();
}
return keyStr;
return keyStr.ToLower();
}
}

View File

@@ -102,19 +102,19 @@ namespace PARR.DAL.DomainServices.Implementations
switch (type)
{
case SyncTaskEntityTypeEnum.Job:
typeStr = "j";
typeStr = "job";
break;
case SyncTaskEntityTypeEnum.JobGroup:
typeStr = "g";
typeStr = "group";
break;
case SyncTaskEntityTypeEnum.Template:
typeStr = "t";
typeStr = "template";
break;
default:
break;
}
return redisCacheService.GetKey(new string[] { "ms", typeStr, id.ToString() });
return redisCacheService.GetKey(new string[] { "matching", typeStr, id.ToString() });
}
}
}

View File

@@ -962,7 +962,8 @@ internal class UnitFilterService : IUnitFilterService
private async Task<List<Guid>> GetUnitIdsFromCacheOrDbAsync(JobUnitFilter filter, CancellationToken cancellationToken = default)
{
var cacheKey = cacheService.GetKey(new[] { "uf_ids", filter.UnitFilter }, isUseHash: true);
// var cacheKey = cacheService.GetKey(new[] { "uf_ids", filter.UnitFilter }, isUseHash: true);
var cacheKey = cacheService.GetKey(new[] { "unit filter", "unit name mask" }, new[] { filter.UnitFilter });
var cachedData = await cacheService.GetCachedDataAsync<UnitFilterIds>(cacheKey);
if (cachedData != null)