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> /// </summary>
/// <param name="keyParts"></param> /// <param name="keyParts"></param>
/// <param name="isUseHash"></param> /// <param name="keyPartsToHash"></param>
/// <returns></returns> /// <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) if (keyParts.Length == 0)
{ {
throw new ArgumentNullException("keyParts не может быть пустым"); 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)
{ {
var partsToHashStr = string.Join(mainSeparator, keyPartsToHash).Replace(" ", wordSeparator);
using var sha256 = System.Security.Cryptography.SHA256.Create(); using var sha256 = System.Security.Cryptography.SHA256.Create();
var hashedBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(keyStr)); var hashedBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(partsToHashStr));
// return Convert.ToBase64String(hashedBytes).Replace('+', '-').Replace('/', '_').Substring(0, 16); var base64str = Convert.ToBase64String(hashedBytes).Substring(0, 16);
return 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) switch (type)
{ {
case SyncTaskEntityTypeEnum.Job: case SyncTaskEntityTypeEnum.Job:
typeStr = "j"; typeStr = "job";
break; break;
case SyncTaskEntityTypeEnum.JobGroup: case SyncTaskEntityTypeEnum.JobGroup:
typeStr = "g"; typeStr = "group";
break; break;
case SyncTaskEntityTypeEnum.Template: case SyncTaskEntityTypeEnum.Template:
typeStr = "t"; typeStr = "template";
break; break;
default: default:
break; 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) 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); var cachedData = await cacheService.GetCachedDataAsync<UnitFilterIds>(cacheKey);
if (cachedData != null) if (cachedData != null)