1
Aerospike提供行級鎖定。 (1)此功能可用於實現多記錄操作互斥/鎖定嗎?
(2)推薦?
Aerospike - 實施「批量操作」鎖
示例實現
- 兩個UDF的,一個獲得鎖,一個將其釋放
- 應用程序開始之前必須獲得鎖「操作」
- 鎖記錄可以有TTL的情況下,應用程序無法釋放在一定時間後鎖定 。
- 寫策略執行UDF設置爲「ALL」
-- return true if lock acquisition successful; else return false
function acquireLock(record, lockBin)
if not aerospike:exists(record) then
aerospike:create(record)
end
if record[lockBin] == 1 then
return false
end
record[lockBin] = 1
aerospike:update(record)
return true
end
-- return true if lock release successful, else return false
function releaseLock(record, lockBin)
if not aerospike:exists(record) then
return false
end
if not record[lockBin] == 1 then
return false
end
record[lockBin] = 0
aerospike:update(record)
return false
end
您是否研究過比較和交換(CAS)等樂觀概念或將這些記錄合併爲一個記錄的方法?不建議使用這樣的鎖。這種方法會嚴重限制吞吐量,以每秒更新幾次(最大)。 –
而且最重要的是:鎖不會超過多條記錄,所以您將不得不鎖定兩條記錄,因此必須面對各種死鎖場景。總結是:它可能會給你的應用帶來更多的問題,而不是解決問題。 –
(1)感謝CAS提示。我會看一看。 (2)這個鎖會在整個交易中引入可衡量的延遲。但是操作並不是那麼緊湊,所以併發能力應該還是不錯的。 (3)如果所有客戶知道在開始讀取/寫入相關集之前獲得這一個鎖,則只需要一個鎖。通過TTL,任何死鎖情況都應該得到緩解。 (4)幸運的是,我已經能夠重新設計我的模式以避免需要此鎖。 – Aaron