当前位置: 首页 > ds >正文

DistributedLock 实现.Net分布式锁

在分布式系统中,经常会遇到多个实例同时访问同一份资源的情况,例如:

  • • 多个服务节点同时写入数据库同一行数据
  • • 定时任务在多个节点上同时运行,导致重复执行
  • • 多实例写缓存时出现数据覆盖问题

为了解决 并发冲突 和 数据一致性 问题,就需要用到 分布式锁

今天给大家介绍一个 .NET 里非常好用的分布式锁库 —— DistributedLock


什么是 DistributedLock

DistributedLock 是一个轻量级、线程安全的 .NET 库,用来在分布式环境下实现锁的功能。支持多种后端存储,包括:

  • • Redis
  • • SQL Server
  • • PostgreSQL
  • • MySQL
  • • MongoDB
  • • 内存模式(本地锁)

只需要更换存储提供程序,就能无缝地在不同的环境下使用。


基本使用

安装 NuGet 包

在项目中引入需要的后端依赖,如:

dotnet add package DistributedLock  --包含所有实现的元包
dotnet add package DistributedLock.Redis
dotnet add package DistributedLock.SqlServer

(Redis 和 SQL Server 是最常见的场景,也可以选择别的实现)


使用 Redis 分布式锁

  var RedisConnectionString = "localhost:6379,abortConnect=false";var LockName = "MyResourceLock";var connection = await ConnectionMultiplexer.ConnectAsync(RedisConnectionString); // uses StackExchange.Redisvar @lock = new RedisDistributedLock(LockName, connection.GetDatabase());await using (var handle = await @lock.TryAcquireAsync()){if (handle != null) { /* I have the lock */ }}

只要使用 Acquire / AcquireAsync 获取锁,代码块执行完毕后会自动释放,非常优雅。


使用 SQL Server 分布式锁

using Medallion.Threading.SqlServer;
using System;
using System.Threading;
using System.Threading.Tasks;namespace DistributedLockDemo
{internal class Program{static async Task Main(string[] args){var connectionString = "Server=myServerAddress;Database=Locks;User Id=myUsername;Password=myPassword;";var lockName = "MyResourceLock";// 创建分布式锁对象(不需要 using,因为它不实现 IDisposable)var sqlLock = new SqlDistributedLock(lockName, connectionString);// 尝试获取锁,返回的锁句柄(LockHandle)实现了 IDisposableusing (var lockHandle = sqlLock.TryAcquire(TimeSpan.FromSeconds(30))){if (lockHandle != null) // 判断是否成功获取锁{// 持有锁,执行需要同步的代码Console.WriteLine("Lock acquired, performing operation...");// 模拟业务操作await Task.Delay(1000); // 建议使用异步延迟而非 Thread.Sleep}else{Console.WriteLine("Failed to acquire lock within the timeout.");}} // 此处会自动释放锁(lockHandle.Dispose())}}
}

在 定时任务(Quartz、Hangfire 等) 场景中,特别适合用来避免多节点重复执行。


依赖注入集成

appsettings.json

{"ConnectionStrings": {"SqlServer": "Server=myServerAddress;Database=Locks;User Id=myUsername;Password=myPassword;","Redis": "localhost:6379"}
}

DistributedLock 支持依赖注入,适合在项目中使用。

// Startup.cs 或 Program.cs
public void ConfigureServices(IServiceCollection services)
{var connectionString = Configuration.GetConnectionString("SqlServer");services.AddSingleton<IDistributedLockProvider>(_ => new SqlDistributedSynchronizationProvider(connectionString));services.AddTransient<SomeService>();
}// SomeService.cs
public class SomeService
{private readonly IDistributedLockProvider _lockProvider;public SomeService(IDistributedLockProvider lockProvider){_lockProvider = lockProvider;}public async Task InitializeUserAccountAsync(int id){var @lock = _lockProvider.CreateLock(#34;UserAccount{id}");await using (await @lock.AcquireAsync()){// 执行需要同步的操作Console.WriteLine(#34;Initializing user account {id}...");await Task.Delay(1000);}}
}

续租机制与 RedLock

DistributedLock 的 Redis 实现内置了“看门狗”机制,定期检查锁是否仍由当前线程持有,并自动延长锁的过期时间,避免因业务处理时间过长导致锁失效。

DistributedLock 的 Redis 实现支持 RedLock 算法,通过在多个 Redis 节点上获取锁(至少 N/2+1 个节点)来确保高可靠性。RedLock 适合对一致性要求极高的场景。

适用场景

  • • 定时任务防重入(保证只有一个节点执行)
  • • 业务幂等控制(防止重复提交订单)
  • • 缓存击穿保护(避免多个实例同时回源数据库)
  • • 资源互斥访问(文件写入、消息处理等)

DistributedLock 是一个简单易用的分布式锁库,支持多种后端,特别适合用在微服务和分布式任务中。

如果你正在开发 分布式系统,强烈建议把它加入到你的工具库里。

原文链接:DistributedLock 实现.Net分布式锁

http://www.xdnf.cn/news/19124.html

相关文章:

  • 智能养花谁更优?WebIDE PLOY技术与装置的结合及实践价值 —— 精准养护的赋能路径
  • 北斗导航 | 工信部印发《关于优化业务准入促进卫星通信产业发展的指导意见》解析
  • MySQL数据库精研之旅第十三期:吃透用户与权限管理,筑牢数据库安全第一道防线
  • 【MySQL数据库】存储引擎 学习记录
  • 高光谱成像在食品质量和安全检测中的应用
  • 【C++游记】子承父业——乃继承也
  • [p2p-Magnet] 队列与处理器 | DHT路由表
  • iOS文件管理在uni-app开发中的实战应用,多工具解决
  • hive on tez如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算
  • 密码管理中
  • 水果目标检测[2]:ALAD-YOLO:一种轻便、精确的苹果叶病检测仪
  • 学习Python中Selenium模块的基本用法(7:元素操作-1)
  • 【golang长途旅行第33站】常量------补充知识点
  • golang 12 package 和 module
  • Docker 入门指南:从基础概念到常见命令及高级工具详解
  • C++:知识点小结
  • vue2 watch 的使用
  • 从 WPF 到 Avalonia 的迁移系列实战篇1:依赖属性的异同点与迁移技巧
  • LangChain4j入门一:LangChain4j简介及核心概念
  • Python计算点云的欧式、马氏、最近邻、平均、倒角距离(Chamfer Distance)
  • 嵌入式C语言进阶:高效数学运算的艺术与实战
  • MySQL 8 与 PostgreSQL 17 对比分析及迁移指南
  • 【网络】网络基础概念
  • HarmonyOS安全开发实战:一套好用的数据加密方案
  • mysql mvcc机制详解
  • Java全栈开发面试实战:从基础到微服务架构的深度解析
  • IntelliJ IDEA Debug 模式功能指南
  • 替身演员的艺术:pytest-mock 从入门到飙戏
  • 寻找AI——初识墨刀AI
  • 极海发布APM32F425/427系列高性能MCU:助力工业应用升级