實現分布式物件鎖

2021-09-05 23:56:11 字數 4145 閱讀 3735

在資料操作中經常需要鎖乙個物件來達到資料同步的目的;在乙個應用程式中鎖物件比較方便,因為c#提供了執行緒鎖物件功能,但如果是不同伺服器的資料操作需要鎖物件就必須做乙個物件鎖服務了。

制定功能方法:

enter(string owner,string id, int milliseconds)

獲取物件鎖,直到獲取擁用權再往下走

owner:鎖的擁有者

id:鎖的標識

milliseconds:鎖物件的時間,超過這個時間即使程式沒有釋放標識,元件自動釋放

exit(string owner,string id)

owner:鎖的擁有者

tryenter(string owner, string id, int milliseconds, int timeout)

獲取物件鎖,在指定時間內沒有獲取相關標識的鎖就放棄往下執行

owner:鎖的擁有者

id:鎖的標識

milliseconds:鎖物件的時間,超過這個時間即使程式沒有釋放標識,元件自動釋放

timeout:超時時間

tryenter(string id, int milliseconds, int timeout, smark.core.asyncdelegatelockhandler)

獲取物件鎖,根據情況呼叫相關回委託

owner:鎖的擁有者

id:鎖的標識

milliseconds:鎖物件的時間,超過這個時間即使程式沒有釋放標識,元件自動釋放

timeout:超時時間

lockhandler:委託

public

class

objectenter:idisposable

public

objectenter(

string

id)public

objectenter(

string

id, 

intmilliseconds)

private

string

mid 

=null

;private

static

dictionary

<

string

, lockitem

>

mobjecttable 

=new

dictionary

<

string

, lockitem

>

(100

);public

static

void

tryenter(

string

id, smark.core.asyncdelegate

<

string

,bool

>

lockhandler)

public

static

void

tryenter(

string

id, 

intmilliseconds, 

inttimeout, smark.core.asyncdelegate

<

string

,bool

>

lockhandler)

public

static

bool

tryenter(

string

owner, 

string

id, 

intmilliseconds, 

inttimeout)

else

}public

static

void

enter(

string

owner,

string

id, 

intmilliseconds)

}public

static

void

exit(

string

owner,

string

id)private

static

lockitem getlockitem(

string

id)else

return

item;}}

private

static

void

checkexpires()

}system.threading.thread.sleep(

5000);}

}class

lockitem

public

bool

enter(

string

owner, 

intmilliseconds, queuestate handler)

count++;

entrermilliseconds 

=milliseconds;

entertime 

=datetime.now;

return

true;}

}private

void

enterwait(queuestate handler)

}private

queue

<

queuestate

>

mwaithandle 

=new

queue

<

queuestate

>

();public

void

exit(

string

owner)

else}if

(count ==0

)}}}

}public

intentrermilliseconds

public

datetime entertime

public

string

idpublic

string

owner

public

intcount

public

void

expires()}}

#region

idisposable 成員

private

bool

mdisposed 

=false

;public

void

dispose()}}

#endregion

}class

queuestate

public

bool

idle

public

intentrermilliseconds

public

inttimeout

private

system.threading.eventwaithandle mhandler 

=new

eventwaithandle(

false

, eventresetmode.manualreset);

public

system.threading.eventwaithandle handler}}

實現相關鎖的web服務

//////

物件鎖服務

///

[webservice(namespace ="

")][webservicebinding(conformsto 

=wsiprofiles.basicprofile1_1)]

[system.componentmodel.toolboxitem(

false

)]public

class

objectenterservice : system.web.services.webservice

);return

owner;

}[webmethod]

public

void

exit(

string

owner, 

string

id)}

服務比較簡單如果能鎖住物件就返回乙個擁有者的id,釋放的時候需要轉入這個擁有者的id和鎖標識.

實現分布式物件鎖

在資料操作中經常需要鎖乙個物件來達到資料同步的目的 在乙個應用程式中鎖物件比較方便,因為c 提供了執行緒鎖物件功能,但如果是不同伺服器的資料操作需要鎖物件就必須做乙個物件鎖服務了。制定功能方法 enter string owner,string id,int milliseconds 獲取物件鎖,直...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

分布式鎖實現

1,資料庫實現原理 資料庫的行級x鎖。優點 不需要引入第三方應用。缺點 死鎖 對資料庫效能影響,可能較長時間占用資料庫連線資源 如果業務是分庫分表的,可能支援不了 示例 2,快取實現原理 通過setnx是否成功。當且僅當 key 不存在,將 key 的值設為 value 並返回1 若給定的 key ...