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, 重大变更)一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号