新聞中心
最近,由于Redis在緩存技術(shù)方面的迅速發(fā)展,它在實(shí)現(xiàn)鎖機(jī)制方面越來越受到許多人的青睞。實(shí)際上,把Redis用作分布式鎖也是很棒的選擇,但是在某些特殊場(chǎng)景下,Redis 可能不是最佳的選擇。所以不使用Redis也可以實(shí)現(xiàn)鎖機(jī)制。

創(chuàng)新互聯(lián)建站專注于香洲網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供香洲營銷型網(wǎng)站建設(shè),香洲網(wǎng)站制作、香洲網(wǎng)頁設(shè)計(jì)、香洲網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造香洲網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供香洲網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
例如使用文件鎖,比如有一個(gè)文件“unique.lock”,只要該文件存在,則表示希望對(duì)應(yīng)的資源被鎖定。此時(shí),任何嘗試訪問該資源的程序都會(huì)檢查是否存在該文件。如果存在,則會(huì)放棄鎖定該資源,因?yàn)槠渌绦蛞呀?jīng)占用了該鎖。用Python實(shí)現(xiàn)文件鎖會(huì)如下:
import os
# 加鎖
def acquire_lock(lock_dir):
global lock_fd
lock_path = lock_dir + '/unique.lock'
# 通過文件鎖的Linux的open系統(tǒng)調(diào)用
order = os.O_CREAT | os.O_TRUNC | os.O_WRONLY
lock_fd = os.open(lock_path, order)
# 阻塞式獲取文件鎖
os.lockf(lock_fd, os.F_LOCK, 0)
# 釋放鎖
def release_lock():
# 釋放文件鎖
os.lockf(lock_fd, os.F_ULOCK, 0)
os.close(lock_fd)
另一種實(shí)現(xiàn)鎖機(jī)制的方法是通過** 數(shù)據(jù)庫 **操作實(shí)現(xiàn),MySQL本身就提供了一個(gè)“SELECT … FOR UPDATE”語句,該語句會(huì)確認(rèn)一行記錄,以便事務(wù)可以更新它,而另一個(gè)事務(wù)無法在給定時(shí)間內(nèi)更新。
使用MySQL實(shí)現(xiàn)數(shù)據(jù)庫鎖的具體實(shí)現(xiàn)如下:
# 加鎖
def acquire_lock():
sql = "SELECT * FROM table WHERE X=Y FOR UPDATE"
# 執(zhí)行sql語句
cur.execute(sql)
# 釋放鎖
def release_lock():
# 自動(dòng)釋放鎖
conn.commit()
總體而言,上面兩種方法不用Redis也可以實(shí)現(xiàn)鎖機(jī)制,但有的優(yōu)缺點(diǎn):
* 文件鎖實(shí)現(xiàn)起來比較簡單,但不適合分布式環(huán)境;
* 數(shù)據(jù)庫鎖支持分布式,但是在一方面需要消耗大類資源,另一方面在高并發(fā)情況下,鎖容易被占用。
因此,上面所闡述的鎖機(jī)制都不是最佳選擇,Redis作為更特殊的場(chǎng)景如分布式鎖,其安全性、易用性和可靠性優(yōu)勢(shì)在對(duì)比中可見一斑。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享文章:不用Redis來實(shí)現(xiàn)鎖機(jī)制(不用redis做鎖)
瀏覽地址:http://m.fisionsoft.com.cn/article/cdegdgc.html


咨詢
建站咨詢
