50 lines
1.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|