最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

DistributedLock?實現(xiàn).Net分布式鎖功能

 更新時間:2025年08月29日 09:28:11   作者:LongtengGensSupreme  
DistributedLock是一個輕量級、線程安全的.NET庫,用來在分布式環(huán)境下實現(xiàn)鎖的功能,今天給大家介紹一個.NET里非常好用的分布式鎖庫DistributedLock,感興趣的朋友跟隨小編一起看看吧

在分布式系統(tǒng)中,經(jīng)常會遇到多個實例同時訪問同一份資源的情況,例如:

  • 多個服務(wù)節(jié)點同時寫入數(shù)據(jù)庫同一行數(shù)據(jù)
  • 定時任務(wù)在多個節(jié)點上同時運行,導(dǎo)致重復(fù)執(zhí)行
  • 多實例寫緩存時出現(xiàn)數(shù)據(jù)覆蓋問題

為了解決 并發(fā)沖突 和 數(shù)據(jù)一致性 問題,就需要用到 分布式鎖。

今天給大家介紹一個 .NET 里非常好用的分布式鎖庫 —— DistributedLock。

什么是 DistributedLock

DistributedLock 是一個輕量級、線程安全的 .NET 庫,用來在分布式環(huán)境下實現(xiàn)鎖的功能。支持多種后端存儲,包括:

  • Redis
  •  SQL Server
  •  PostgreSQL
  •  MySQL
  •  MongoDB
  •  內(nèi)存模式(本地鎖)

只需要更換存儲提供程序,就能無縫地在不同的環(huán)境下使用。

基本使用

安裝 NuGet 包

在項目中引入需要的后端依賴,如:

dotnet add package DistributedLock  --包含所有實現(xiàn)的元包
dotnet add package DistributedLock.Redis
dotnet add package DistributedLock.SqlServer

(Redis 和 SQL Server 是最常見的場景,也可以選擇別的實現(xiàn))

使用 Redis 分布式鎖

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

只要使用 Acquire / AcquireAsync 獲取鎖,代碼塊執(zhí)行完畢后會自動釋放,非常優(yōu)雅。

使用 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";
            // 創(chuàng)建分布式鎖對象(不需要 using,因為它不實現(xiàn) IDisposable)
            var sqlLock = new SqlDistributedLock(lockName, connectionString);
            // 嘗試獲取鎖,返回的鎖句柄(LockHandle)實現(xiàn)了 IDisposable
            using (var lockHandle = sqlLock.TryAcquire(TimeSpan.FromSeconds(30)))
            {
                if (lockHandle != null) // 判斷是否成功獲取鎖
                {
                    // 持有鎖,執(zhí)行需要同步的代碼
                    Console.WriteLine("Lock acquired, performing operation...");
                    // 模擬業(yè)務(wù)操作
                    await Task.Delay(1000); // 建議使用異步延遲而非 Thread.Sleep
                }
                else
                {
                    Console.WriteLine("Failed to acquire lock within the timeout.");
                }
            } // 此處會自動釋放鎖(lockHandle.Dispose())
        }
    }
}

在 定時任務(wù)(Quartz、Hangfire 等) 場景中,特別適合用來避免多節(jié)點重復(fù)執(zhí)行。

依賴注入集成

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())
        {
            // 執(zhí)行需要同步的操作
            Console.WriteLine(#34;Initializing user account {id}...");
            await Task.Delay(1000);
        }
    }
}

續(xù)租機制與 RedLock

DistributedLock 的 Redis 實現(xiàn)內(nèi)置了“看門狗”機制,定期檢查鎖是否仍由當(dāng)前線程持有,并自動延長鎖的過期時間,避免因業(yè)務(wù)處理時間過長導(dǎo)致鎖失效。

DistributedLock 的 Redis 實現(xiàn)支持 RedLock 算法,通過在多個 Redis 節(jié)點上獲取鎖(至少 N/2+1 個節(jié)點)來確保高可靠性。RedLock 適合對一致性要求極高的場景。

適用場景

  • 定時任務(wù)防重入(保證只有一個節(jié)點執(zhí)行)
  • 業(yè)務(wù)冪等控制(防止重復(fù)提交訂單)
  • 緩存擊穿保護(避免多個實例同時回源數(shù)據(jù)庫)
  • 資源互斥訪問(文件寫入、消息處理等)

DistributedLock 是一個簡單易用的分布式鎖庫,支持多種后端,特別適合用在微服務(wù)和分布式任務(wù)中。

如果你正在開發(fā) 分布式系統(tǒng),強烈建議把它加入到你的工具庫里。

原文鏈接:DistributedLock 實現(xiàn).Net分布式鎖

到此這篇關(guān)于DistributedLock 實現(xiàn).Net分布式鎖的文章就介紹到這了,更多相關(guān)DistributedLock .Net分布式鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .net Core 使用IHttpClientFactory請求實現(xiàn)

    .net Core 使用IHttpClientFactory請求實現(xiàn)

    這篇文章主要介紹了.net Core 使用IHttpClientFactory請求實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • asp.net HttpWebRequest自動識別網(wǎng)頁編碼

    asp.net HttpWebRequest自動識別網(wǎng)頁編碼

    HttpWebRequest獲取網(wǎng)頁源代碼時自動識別網(wǎng)頁編碼,通過讀取頁面中的charset和讀取http頭中的編碼信息獲取頁面的編碼,基本可以正確獲取網(wǎng)頁編碼
    2008-09-09
  • 根據(jù)控件Id得到控件并對該控件進行操作

    根據(jù)控件Id得到控件并對該控件進行操作

    在做動態(tài)獲取控件時,時常需要根據(jù)Id得到控件,并對該控件進行操作,示例如下,大家可以參考下
    2014-06-06
  • .Net微信網(wǎng)頁開發(fā)解決用戶在不同公眾號或在公眾號、移動應(yīng)用之間帳號統(tǒng)一問題

    .Net微信網(wǎng)頁開發(fā)解決用戶在不同公眾號或在公眾號、移動應(yīng)用之間帳號統(tǒng)一問題

    這篇文章主要介紹了.Net微信網(wǎng)頁開發(fā)解決用戶在不同公眾號或在公眾號、移動應(yīng)用之間帳號統(tǒng)一問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • asp.net AJAX注冊類

    asp.net AJAX注冊類

    單純用JavaScript,不需要注冊,但是就是用不了AJAX的某些機制。
    2010-02-02
  • 淺析.Net Core中Json配置的自動更新

    淺析.Net Core中Json配置的自動更新

    這篇文章主要介紹了淺析.Net Core中Json配置的自動更新,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • .NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例

    .NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例

    本篇文章小編將為大家介紹,.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例,有需要的朋友可以參考一下
    2013-04-04
  • 使用asp.net MVC4中的Bundle遇到的問題及解決辦法分享

    使用asp.net MVC4中的Bundle遇到的問題及解決辦法分享

    這篇文章主要介紹了使用asp.net MVC4中的Bundle遇到的問題及解決辦法,需要的朋友可以參考下
    2014-02-02
  • .NET?HttpClient簡單使用教程

    .NET?HttpClient簡單使用教程

    SpringCloud中服務(wù)和服務(wù)之間的調(diào)用全部是使用HttpClient,還有前面使用SolrJ中就封裝了HttpClient,在調(diào)用SolrTemplate的saveBean方法時就調(diào)用HttpClient技術(shù)。接下來通過本文給大家介紹.net?HttpClient簡單使用教程,需要的朋友可以參考下
    2021-11-11
  • ASP.net連接Excel的代碼

    ASP.net連接Excel的代碼

    ASP.net連接Excel的代碼,這個是asp.net操作excel必須知道的基礎(chǔ),另外的技巧可以參考腳本之家之前發(fā)布的文章。
    2010-03-03

最新評論

太白县| 永泰县| 墨脱县| 青冈县| 伊吾县| 内乡县| 读书| 涪陵区| 张家港市| 乌海市| 上思县| 石泉县| 沈丘县| 扎囊县| 城固县| 楚雄市| 皋兰县| 饶阳县| 浙江省| 都昌县| 洪江市| 大连市| 富蕴县| 延边| 商洛市| 台东县| 万州区| 宜川县| 东明县| 大安市| 清水县| 漳州市| 华池县| 武川县| 商丘市| 神池县| 宜章县| 滦平县| 梁山县| 大埔县| 五原县|