找回密码
 立即注册
首页 业界区 业界 .NET应用中的高效分布式同步解决方案

.NET应用中的高效分布式同步解决方案

聚怪闩 2025-6-30 11:46:24
前言

在分布式系统中,多个线程、进程或服务之间常常需要并发访问共享资源,这就带来了数据同步与一致性的挑战。今天大姚给大家分享一个.NET应用中的高效分布式同步解决方案:DistributedLock。
项目介绍

DistributedLock 是一个 .NET 开源的库,它基于多种底层技术提供了强大且易于使用的分布式互斥锁、读写锁和信号量。确保多个线程、进程或服务能够安全、协调地访问共享资源,防止竞态条件,维护数据一致性。
多种技术的实现方案

DistributedLock 提供了基于多种技术的实现方案,你可以单独安装所需的实现包,也可以直接安装 DistributedLock NuGet 包使用。
1.png

项目源代码

2.png

DistributedLock 包安装

在 NuGet 包管理器中搜索:DistributedLock 安装。
3.png

 
在 ASP.NET Core 应用中使用

对于使用依赖注入的应用程序,DistributedLock 的提供程序可以轻松地将锁(或其他原语)名称的规范与其其他设置(如数据库连接字符串)分离开来。例如,在一个 ASP.NET Core 应用程序中,你可以这样做:
Program.cs 中注册
  1.         var builder = WebApplication.CreateBuilder(args);

  2.         // Add services to the container.
  3.         builder.Services.AddRazorPages();

  4.         // 注册一个单例的 IDistributedLockProvider,使用 Postgres 作为底层实现
  5.         builder.Services.AddSingleton<IDistributedLockProvider>(_ => new PostgresDistributedSynchronizationProvider(myConnectionString));
  6.         builder.Services.AddTransient<UserAccountService>();
复制代码
对账户进行同步的初始化操作
  1.     public class UserAccountService
  2.     {
  3.         private readonly IDistributedLockProvider _synchronizationProvider;

  4.         /// <summary>
  5.         /// 构造函数,接受 IDistributedLockProvider 的注入
  6.         /// </summary>
  7.         /// <param name="synchronizationProvider">synchronizationProvider</param>
  8.         public UserAccountService(IDistributedLockProvider synchronizationProvider)
  9.         {
  10.             this._synchronizationProvider = synchronizationProvider; // 将注入的 IDistributedLockProvider 赋值给私有字段
  11.         }

  12.         public void InitializeUserAccount(int id)
  13.         {
  14.             // 使用提供者来构造一个锁
  15.             var currentLock = this._synchronizationProvider.CreateLock($"UserAccount{id}"); // 根据用户账户ID创建一个锁
  16.             using (currentLock.Acquire()) // 获取锁,并在 using 块结束时自动释放
  17.             {
  18.                 // 执行操作(在锁保护下)
  19.             }

  20.             // 或者,对于常见用例,扩展方法允许通过单个调用来完成此操作
  21.             using (this._synchronizationProvider.AcquireLock($"UserAccount{id}")) // 直接使用提供者的扩展方法来获取并释放锁
  22.             {
  23.                 // 执行操作(在锁保护下)
  24.             }
  25.         }
  26.     }
复制代码
基于 Redis 实现的分布式锁

DistributedLock.Redis 包提供了基于 Redis 实现的分布式锁功能,如下所示:

  • 实现说明:https://redis.io/docs/latest/develop/use/patterns/distributed-locks
  1.             var connectionString = "redis链接";
  2.             var connection = await ConnectionMultiplexer.ConnectAsync(connectionString); // uses StackExchange.Redis
  3.             var currentLock = new RedisDistributedLock("MyLockName", connection.GetDatabase());
  4.             await using (var handle = await currentLock.TryAcquireAsync())
  5.             {
  6.                 if (handle != null)
  7.                 {
  8.                     //我已经获取了锁
  9.                 }
  10.             }
复制代码
基于 ZooKeeper 实现的分布式锁

DistributedLock.ZooKeeper 包提供过了基于 Apache ZooKeeper 提供的分布式锁功能,如下所示:

  • 实现说明:https://zookeeper.apache.org/doc/r3.1.2/recipes.html
  1.             var currentLock = new ZooKeeperDistributedLock("MyLockName", connectionString);
  2.             await using (await currentLock.AcquireAsync())
  3.             {
  4.                 // 我已经获取了锁
  5.             }
复制代码
项目源码地址


更多项目实用功能和特性欢迎前往项目开源地址查看
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册