feat(core, infrastructure): UnitService - удаление/массовое удаление юнитов

This commit is contained in:
Mikhail Trubnikov
2026-06-01 16:10:00 +10:00
parent bdcc858bc5
commit d27d594e57
6 changed files with 80 additions and 7 deletions

View File

@@ -1,6 +1,5 @@
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using PARR.Core.Common.Interfaces;
using PARR.Infrastructure.Redis.Helpers;
using StackExchange.Redis;
@@ -376,6 +375,32 @@ namespace PARR.Infrastructure.Redis
await redis.HashDeleteAsync(hashKey, field);
}
public async Task DeleteHashFieldsAsync(List<(string HashKey, string FieldKey)> keys)
{
if (keys == null || keys.Count == 0)
return;
int deletedCount = 0;
// Делим на порции по 5000, чтобы не перегружать буфер команд Redis
foreach (var chunk in keys.Chunk(5000))
{
var tasks = new List<Task<bool>>(chunk.Length);
foreach (var key in chunk)
tasks.Add(redis.HashDeleteAsync(key.HashKey, key.FieldKey));
logger.LogDebug("Отправил пачку из {Count} команд на удаление в Redis", tasks.Count);
// Ждем выполнения текущей порции команд удалений
bool[] results = await Task.WhenAll(tasks);
// Считаем, сколько элементов реально было удалено
deletedCount += results.Count(x => x == true);
}
logger.LogDebug("Успешно удалено элементов из кэша: {Count}.", deletedCount);
}
public async Task<bool> HashFieldExistsAsync(string hashKey, string field)
{
// есть ли запись в Hash