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 _logger; public DuplicateChecker( RedisConnection redis, IOptions settings, ILogger logger) { _redis = redis; _settings = settings.Value; _logger = logger; } public async Task 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; } } }