Aerospike - 实现 "batch operation" 锁
Aerospike - Implementing a "batch operation" lock
Aerospike 提供行级锁定。
(1) 这个特性可以用来实现多记录操作吗mutex/lock?
(2)推荐?
示例实现
- 两个UDF,一个获取锁,一个释放锁
- 应用程序必须在启动前获取锁 "operation"
- 锁定记录可以有 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
总结一下其他人的几条评论:
虽然可行,但由于性能不佳,强烈建议不要使用此实现。查看 Aerospike 的比较和交换 (CAS) 功能以实现类似的功能。
Aerospike 提供行级锁定。
(1) 这个特性可以用来实现多记录操作吗mutex/lock?
(2)推荐?
示例实现
- 两个UDF,一个获取锁,一个释放锁
- 应用程序必须在启动前获取锁 "operation"
- 锁定记录可以有 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
总结一下其他人的几条评论:
虽然可行,但由于性能不佳,强烈建议不要使用此实现。查看 Aerospike 的比较和交换 (CAS) 功能以实现类似的功能。