feat(core, infrastructure): UnitService - удаление/массовое удаление юнитов
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user