Skip to content

Latest commit

 

History

History
49 lines (41 loc) · 2.26 KB

README_CN.md

File metadata and controls

49 lines (41 loc) · 2.26 KB

RedisLock

NuGet Publish Workflow NuGet GitHub issues GitHub repo size in bytes GitHub top language

StackExchange.Redis LockTake 的阻塞实现和锁的自动释放。

How to use

  • nuget 引入 Kirov.RedisLock 包.
public class Example
{
    private readonly IDatabase _redisDatabase;
    public Example(ConnectionMultiplexer connectionMultiplexer)
    {
        this._redisDatabase = connectionMultiplexer.GetDatabase();
    }

    public async Task ExampleFunction()
    {
        // 等待锁获取。
        await using (await _redisDatabase.BlockLockTakeAsync("key", "value"))
        {
            // 同步区间的代码。
        }
    }
}

完全不用关心锁的释放时机,在 using 方法块结束时会自动释放。它还有一些重载方法:

// 这将导致锁在 3 分钟后被释放,即使 using 没有释放锁 (实际上,它只是将参数传递给 IDatabase.LockTakeAsync(expiry))。
BlockLockTakeAsync("key", "value", TimeSpan.FromMinutes(3));

// 锁在最多在三分钟后被释放。
// 如果没有获得锁,则每 200 毫秒再次尝试获得锁。
// 这个参数配置是 BlockLockTakeAsync() 方法的默认值。
BlockLockTakeAsync("key", "value", TimeSpan.FromMinutes(3), TimeSpan.FromMilliseconds(200));

// 获取锁时最多等待 5000 毫秒,超时则抛出 OperationCanceledException。
var cts = new CancellationTokenSource(5000);
BlockLockTakeAsync("key", "value", cts.Token);