在資料操作中經常需要鎖乙個物件來達到資料同步的目的;在乙個應用程式中鎖物件比較方便,因為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 ...