/
afanasevn
/
RedisLab
Обзор
Документация
Войти
/
afanasevn
/
RedisLab
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/RedisLab.Infrastructure/Redis/DistributedLockService.cs
38 строк
1 KB
IBS\NAfanasev
Solution commit
24 июн 2026, 16:45
24 июн 2026, 16:45
bab80b7
Код
Авторство
О чём код?
using Microsoft.Extensions.Logging; using RedisLab.Application.Abstractions; using StackExchange.Redis; namespace RedisLab.Infrastructure.Redis; /// <summary> /// Distributed lock на Redis String: SET key owner NX EX ttl. /// </summary> public sealed class DistributedLockService( IConnectionMultiplexer redis, ILogger<DistributedLockService> logger) : IDistributedLockService { /// <inheritdoc /> public async Task<bool> TryAcquireAsync( string key, string ownerId, TimeSpan ttl, CancellationToken ct) { var database = redis.GetDatabase(); // NX — set only if not exists; EX — auto-release через ttl секунд (страховка при падении инстанса). // Это учебный lock, не Redlock: для cron достаточно одного Redis master. var acquired = await database.StringSetAsync( key, ownerId, ttl, When.NotExists); if (acquired) { logger.LogDebug("Lock {Key} захвачен owner={Owner}, TTL={Ttl} сек", key, ownerId, ttl.TotalSeconds); } return acquired; } }