Skip to content

分布式锁

234 words
1 min

集成

  • 引用Volo.Abp.DistributedLocking包,并且添加模块依赖.
  • 引用DistributedLock.Redis包
csharp
namespace AbpDemo
{
    [DependsOn(typeof(AbpDistributedLockingModule))]
    public class MyModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddAbpProRedisDistributedLocking();
        }

    /// <summary>
    /// 注册redis分布式锁
    /// </summary>
    public static IServiceCollection AddAbpProRedisDistributedLocking(this IServiceCollection service)
    {
        var configuration = service.GetConfiguration();
        var connectionString = configuration.GetValue<string>("Redis:Configuration");
        service.AddSingleton<IDistributedLockProvider>(sp =>
        {
            var connection = ConnectionMultiplexer.Connect(connectionString);
            return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
        });
        return service;
    }    
}

sample

csharp
namespace AbpDemo
{
    public class MyService : ITransientDependency
    {
        private readonly IAbpDistributedLock _distributedLock;
		public MyService(IAbpDistributedLock distributedLock)
        {
            _distributedLock = distributedLock;
        }
        
        public async Task MyMethodAsync()
        {
            await using (var handle = await _distributedLock.TryAcquireAsync("MyLockName"))
            {
                if (handle != null)
                {
                    // 获取到锁执行业务逻辑
                }
                else
                {
                    // 未获取到锁
                    // 处理异常
                }
            }   
        }
    }
}

注意

TryAcquireAsync参数说明:

  • name (string, required):锁的唯一名称。不同的命名锁用于访问不同的资源。
  • timeout (TimeSpan):等待获取锁的超时值。默认值为TimeSpan.Zero ,这意味着如果锁已由另一个应用程序拥有,则它不会等待。
  • cancellationToken:稍后可以触发以取消操作的取消令牌。

如有转载或 CV 的请标注本站原文地址