.NET 코어 지연 큐 레디 스를 사용

첫째, 프로젝트 시나리오 :

순서까지 가까이에서 시간 순서대로 다음 작업을 추가하고 작업의 실행 시간을 설정합니다.

둘째, 아이디어 :

순서화 된 세트는 타임 스탬프 순서, 대략 다음 프로세스로 구현합니다 (SortedSet의)가 이용 될 수있다 레디 스.

셋째, 비판적 사고 및 코드 섹션

  1. 쓰기 작업

    분 다음 태스크의 실행 시간을 사용하여 키를 생성 동일한 작업 분 키에 수행되는이 단계의 주요 문제는 생각한다 : 각각의 만료 시간을 제공 분할 큐, 등 : 유효 시간의 실행 시간 = + 5 분 큐가 자동으로 인해 레디 스에 의해 발생 전력이 지속적으로 확대 지출을 초래하지 않는 후속의 부족으로 삭제 만료 허용합니다.

IDictionary<double, string> dic = new Dictionary<double, string>()
{
    {
       interLineCacheModel.NextHandTimeSpan,
       interLineCacheModel.CacheRoute
    }
};
var taskKey = GetKey(interLineCacheModel.NextHandTime);
await _buildInterLineRepository.ZAddAsync(taskKey, dic);
await _buildInterLineRepository.ExpireAsync(taskKey, new DateTimeOffset(interLineCacheModel.NextHandTime.AddMinutes(5)).ToUnixTimeSeconds());
private string GetKey(DateTime dateTime)
{
    return $"IRTask{dateTime.ToString("yyyyMMddHHmm")}";
}
  1. 소비자 서비스

    이 순서화 된 집합이기 때문에, 그래서 시간 스탬프에 의해 큐의 크기가 자동으로 정렬되도록 상기 자동 멀리 근처에서 순차적으로 수행되도록, 현재 시간이 해당 작업을 얻기 위해, 키를 생성하거나, 각각을 얻을 수있다 N 기사.

var taskKey = GetKey(DateTime.Now);
var routeList = await _buildInterLineRepository.ZRangeAsync(taskKey, 0, 0);

실행 시간이 큐 나오지 않은 경우, 해당 실행 시간 스탬프를 받고, 현재 시간을 비교한다.

var nextHandleTs = await _buildInterLineRepository.ZScoreAsync(taskKey, route);
if (long.TryParse(nextHandleTs, out var nextHandleTimeSpan))
{
    var nextHandleTime = DateTimeOffset.FromUnixTimeMilliseconds(nextHandleTimeSpan).ToBeiJingDateTime();
    if (nextHandleTime > DateTime.Now)
    {
       continue;
    }
}

동시에 여러 기계를 해결하기 위해 사람의 성공적인 구현을 보장하기 위해 제거 마지막 단계, 사용 ZRemAsync은 데이터의 문제를 얻으려면

var success = await _buildInterLineRepository.ZRemAsync(taskKey, route) > 0;
if (success)
{
    //todo
}

참고 : 우리가 키를 생성 부족 소비 전력이 여전히 남아있는 주요 작업으로 이어질 경우이 매우 민감한 경우 중요한 점은, 1 초 임계점의 시간에 롤백 할 수있는 시간 있도록하는 연대기 분에 있기 때문에, 모든 작업을 다시. 정지 = -1 모든 컬렉션을 올 수 있습니다.

if second = 0
{
    addsecond(-1);
    var routeList = await _buildInterLineRepository.ZRangeAsync(taskKey, 0, -1);
}

넷째, 등록 된 소비자 서비스

: 본원에서 사용되는 여러 가지면에서, 그것은 IHostedService 구체적으로, 백그라운드 작업을 달성 참조입니다 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.0&tabs=visual -studio

public class InterLineLoopService : IHostedService
    {
        private readonly ILog _log;
        private readonly IInterLineTaskService _interLineTaskService;


        public InterLineLoopService(
            ILog log,
            IInterLineTaskService interLineTaskService)
        {
            _log = Guard.ArgumentNotNull(nameof(log), log);
            _interLineTaskService = Guard.ArgumentNotNull(nameof(interLineTaskService), interLineTaskService);
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            _log.Info("LoopDelayMessage start....", "Domain", "InterLineLoopService", "StartAsync");
            return _interLineTaskService.LoopDelayMessage();
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }

그런 다음 시작시 등록

services.AddHostedService<InterLineLoopService>();

추천

출처www.cnblogs.com/yinpeng186/p/11994055.html