SPMS_API/SPMS.Infrastructure/Caching/DuplicateChecker.cs

50 lines
1.5 KiB
C#

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using SPMS.Application.Interfaces;
using SPMS.Application.Settings;
using StackExchange.Redis;
namespace SPMS.Infrastructure.Caching;
public class DuplicateChecker : IDuplicateChecker
{
private readonly RedisConnection _redis;
private readonly RedisSettings _settings;
private readonly ILogger<DuplicateChecker> _logger;
public DuplicateChecker(
RedisConnection redis,
IOptions<RedisSettings> settings,
ILogger<DuplicateChecker> logger)
{
_redis = redis;
_settings = settings.Value;
_logger = logger;
}
public async Task<bool> IsDuplicateAsync(string requestId, CancellationToken cancellationToken = default)
{
var key = $"{_settings.InstanceName}duplicate:{requestId}";
var ttl = TimeSpan.FromHours(_settings.DuplicateTtlHours);
try
{
var db = await _redis.GetDatabaseAsync();
var wasSet = await db.StringSetAsync(key, "1", ttl, When.NotExists);
if (!wasSet)
{
_logger.LogWarning("중복 메시지 감지: requestId={RequestId}", requestId);
return true;
}
return false;
}
catch (Exception ex)
{
_logger.LogError(ex, "Redis 중복 체크 실패: requestId={RequestId} — 중복 아닌 것으로 처리", requestId);
return false;
}
}
}