日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用Redis隊(duì)列深入探索是否有鎖(redis隊(duì)列有鎖嗎)

Redis隊(duì)列是一種常用的分布式系統(tǒng)中的消息傳遞方法,它能夠容納數(shù)據(jù)庫Microservices和一些事務(wù)性高可用分布式應(yīng)用程序。在設(shè)計(jì)系統(tǒng)時(shí),采用這種隊(duì)列的一個(gè)重要的問題就是,它是否具有鎖機(jī)制,以確保獲取隊(duì)列中元素的唯一性。

需要明確的是,Redis隊(duì)列本身并不支持任何鎖機(jī)制,但可以使用Lua腳本來制定一個(gè)“屏障”,這會(huì)在從Redis隊(duì)列中獲取元素之前,為那些正在準(zhǔn)備獲取元素的客戶端提供一個(gè)短暫的中斷。在以下代碼中,Lua腳本使用“getting”和“acquired”2個(gè)鍵,兩個(gè)鍵都使用相同的值(可以設(shè)置為客戶端的ID),在檢測(cè)到“getting”鍵原本不存在的情況下,僅有一個(gè)客戶端可以去設(shè)置“getting”鍵的值,以表明經(jīng)過了屏障。當(dāng)這個(gè)鍵被設(shè)置完成后,只有擁有這個(gè)值的客戶端才能夠去服務(wù)器獲取這個(gè)隊(duì)列中的元素,獲取元素完成后,要設(shè)置“acquired”鍵。

local key = KEYS[1]
local start_at = tonumber(redis.call('ZSCORE', key, 'getting') or '-1')
local current_time = tonumber(ARGV[1] or '0')
if start_at == -1 or (start_at + 1000)
redis.call('ZADD', key, 'NX', current_time, 'getting')
return true
else
return false
end

使用這種方法能夠確保只有一個(gè)客戶端可以獲取隊(duì)列中的元素,也確保了同一個(gè)客戶端可以獲取多個(gè)元素。然而,這也帶來了一些問題,比如客戶端acquire了一個(gè)鎖,但是沒有按照一定的時(shí)間一直去更新“getting”,那么這個(gè)鎖可能會(huì)有危險(xiǎn)被其它客戶端acquire,而這些新的客戶端可能會(huì)更新當(dāng)前正在使用鎖的客戶端,這樣“acquired”鍵就會(huì)被移除,而這個(gè)客戶端就不能夠獲取隊(duì)列中的任何元素。

Redis隊(duì)列的“鎖機(jī)制”只能確保獲取元素的唯一性,確保一個(gè)客戶端可以獲取多個(gè)元素。它對(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隊(duì)列深入探索是否有鎖(redis隊(duì)列有鎖嗎)
網(wǎng)站路徑:http://www.dlmjj.cn/article/djdiood.html