DistributedLock是一个.NET库,基于各种底层技术提供了健壮且易用的分布式互斥锁、读写锁和信号量。
使用DistributedLock,在多个应用程序/机器之间同步访问代码区域变得非常简单:
await using (await myDistributedLock.AcquireAsync()) { // 我在这里持有锁 }
DistributedLock包含基于各种技术的实现;你可以单独安装实现包,也可以直接安装DistributedLock NuGet包 ,这是一个"元"包,包含所有实现作为依赖项。注意每个包都根据SemVer独立进行版本控制。
WaitHandle(仅限Windows)点击上面任何包的名称查看该实现的具体文档,或继续阅读适用于所有实现的通用文档。
DistributedLock.Core 包含公共代码和抽象,被所有实现引用。
虽然所有实现都支持锁,但其他原语只被某些实现支持。有关详细信息,请参阅特定实现的文档页面。
由于分布式锁(和其他分布式同步原语)不局限于单个进程,它们的身份基于通过构造函数提供的名称。不同的底层技术对名称格式有不同的限制;然而,DistributedLock在很大程度上允许你忽略这些限制,通过转义/散列否则无效的名称。
所有同步原语都支持相同的基本访问模式。Acquire方法返回一个"句柄"对象,表示持有锁。当句柄被处置时,锁被释放:
var myDistributedLock = new SqlDistributedLock(name, connectionString); // 例如,如果我们使用SQL Server using (myDistributedLock.Acquire()) { // 我们在这里持有锁 } // using块的隐式Dispose()调用在这里释放它
虽然Acquire会阻塞直到锁可用,但还有一个TryAcquire变体,如果无法获取锁(因为被其他地方持有),则返回null:
using (var handle = myDistributedLock.TryAcquire()) { if (handle != null) { // 我们获得了锁 :-) } else { // 其他人持有它 :-( } }
这两种方法的async版本也受支持。当你编写异步代码时,这些方法是首选,因为它们在等待锁时不会消耗线程。如果你使用C#8或更高版本,你还可以异步处置句柄:
await using (await myDistributedLock.AcquireAsync()) { ... }
此外,所有这些方法都支持可选的timeout参数。timeout决定了Acquire在失败并抛出TimeoutException之前等待的时间,以及TryAcquire在返回null之前等待的时间。Acquire的默认timeout是Timeout.InfiniteTimeSpan,而TryAcquire的默认timeout是TimeSpan.Zero。
最后,这些方法接受一个可选的CancellationToken参数,允许通过取消来中断获取操作。请注意,一旦获取成功,这不会取消对锁的持有。
对于使用依赖注入的应用程序,DistributedLock的提供者使得将锁(或其他原语)的名称规范与其他设置(如数据库连接字符串)分离变得容易。例如,在ASP.NET Core应用中,你可能这样做:
// 在你的Startup.cs中: services.AddSingleton<IDistributedLockProvider>(_ => new PostgresDistributedSynchronizationProvider(myConnectionString)); services.AddTransient<SomeService>(); // 在SomeService.cs中 public class SomeService { private readonly IDistributedLockProvider _synchronizationProvider; public SomeService(IDistributedLockProvider synchronizationProvider) { this._synchronizationProvider = synchronizationProvider; } public void InitializeUserAccount(int id) { // 使用提供者构造一个锁 var @lock = this._synchronizationProvider.CreateLock($"UserAccount{id}"); using (@lock.Acquire()) { // 做一些事情 } // 或者,对于常见用例,扩展方法允许通过单个调用完成此操作 using (this._synchronizationProvider.AcquireLock($"UserAccount{id}")) { // 做一些事情 } } }
欢迎贡献!如果你有兴趣为新的或现有的问题做出贡献,请通过问题评论让我知道,这样我可以帮助你入门并避免你浪费精力。
在本地使用存储库的设置步骤记录在这里。
DbDataSource 创建 Postgres 锁,这对使用 NpgsqlMultiHostDataSource 的应用很有帮助。感谢 davidngjy 的实现! (#153, DistributedLock.Postgres 1.2.0)pg_advisory_xact_lock 进行事务范围锁定,这对使用 PgBouncer 很有帮助 (#168, DistributedLock.Postgres 1.1.0)net461 的支持 (仍然支持 net462)。感谢 @Bartleby2718 的实现!UnobservedTaskException 的发生 (#192, DistributedLock.Core 1.0.6)FileDistributedLock 的目录创建并发处理 (#195, DistributedLock.FileSystem 1.0.2)HandleLostToken 并发问题 (#133, DistributedLock.Core 1.0.5, DistributedLock.MySql 1.0.1, DistributedLock.Oracle 1.0.1, DistributedLock.Postgres 1.0.3, DistributedLock.SqlServer 1.0.2)。感谢 @OskarKlintrot 的测试!WaitHandle 的异步等待的并发问题 (#120, DistributedLock.WaitHandles 1.0.1)WithKeyPrefix 的数据库时 Redis 锁的行为 (#66, DistributedLock.Redis 1.0.1)。感谢 @skomis-mm 的贡献!IAsyncDisposable 和 IDisposable #20, 重大变更)IDistributedLock) (#10)HandleLostToken API 用于跟踪锁的底层连接是否断开 (#6, 重大变更)GetSafeName API,改为默认安全命名 (重大变更)SqlDistributedLock 中移除 DbConnection 和 DbTransaction 构造函数,保留接受 IDbConnection/IDbTransaction 的构造函数 (#35, 重大变更)Task<IDisposable> 的方法改为返回 ValueTask,使得 using (@lock.AcquireAsync()) { ... } 在没有 await 的情况下不再编译 (#34, 重大变更)UpgradeableLockHandle.UpgradeToWriteLock 改为返回 void (#33, 重大变更)

免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模 型免费使用,一键生成无水印视频
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号