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

需要明確的是,Redis隊列本身并不支持任何鎖機制,但可以使用Lua腳本來制定一個“屏障”,這會在從Redis隊列中獲取元素之前,為那些正在準(zhǔn)備獲取元素的客戶端提供一個短暫的中斷。在以下代碼中,Lua腳本使用“getting”和“acquired”2個鍵,兩個鍵都使用相同的值(可以設(shè)置為客戶端的ID),在檢測到“getting”鍵原本不存在的情況下,僅有一個客戶端可以去設(shè)置“getting”鍵的值,以表明經(jīng)過了屏障。當(dāng)這個鍵被設(shè)置完成后,只有擁有這個值的客戶端才能夠去服務(wù)器獲取這個隊列中的元素,獲取元素完成后,要設(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
使用這種方法能夠確保只有一個客戶端可以獲取隊列中的元素,也確保了同一個客戶端可以獲取多個元素。然而,這也帶來了一些問題,比如客戶端acquire了一個鎖,但是沒有按照一定的時間一直去更新“getting”,那么這個鎖可能會有危險被其它客戶端acquire,而這些新的客戶端可能會更新當(dāng)前正在使用鎖的客戶端,這樣“acquired”鍵就會被移除,而這個客戶端就不能夠獲取隊列中的任何元素。
Redis隊列的“鎖機制”只能確保獲取元素的唯一性,確保一個客戶端可以獲取多個元素。它對于保證元素獲取的安全性是沒有什么幫助的,因此,我們必須深入探索其他安全策略。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站名稱:使用Redis隊列深入探索是否有鎖(redis隊列有鎖嗎)
網(wǎng)站鏈接:http://m.fisionsoft.com.cn/article/djdiood.html


咨詢
建站咨詢
