我使用Redis的创建从一系列声称未使用的整数算法。我的解决方案是基于我得到了this SO问题的答案。
该解决方案使用BITPOS
和BITSET
,并避免竞争条件下,我也用WATCH
/ MULTI
/ EXEC
。为了测试并发方面我创建的同时试图找到一个免费电话号码并行10次,调查EXEC
命令的可能结果bash脚本。
我发现的是,EXEC
从未返回null,即使在观看键被另一客户端修改。我加了延迟,从而有足够的时间去招惹使EXEC
失败时,应该触发钟表机械并发修改,但事实并非如此。
所以基本上我有这段代码:
while (true) {
WATCH mykey
number = BITPOS mykey, 0
if (number > maxNumber) THROW ERROR
(deliberate delay)
MULTI
SETBIT mykey, number, 1
if EXEC != null return number
}
也是一个循环调用SETBIT mykey, N, 1
为N = 1..10
,在10个不同的进程。
我发现的是,EXEC
从未返回null,即使键被另一个过程中的时间观看期间绝对修改。
问题:
WATCH
根本不支持基于BIT Redis命令?WATCH
应该如果密钥已经被其他客户端/连接过程中的时间观看期间被修改,并调用这个来自10个不同的Linux进程,每个进程创建自己的连接EXEC
失败,似乎符合这一要求?WATCH
和MULTI
实际上提供什么? BITSET
返回该位的前值,所以不宜原子由下列伪代码算法简单地保证: while (true) {
number = BITPOS mykey, 0
if (number > maxNumber) THROW ERROR
wasUsed = SETBIT mykey, number, 1
if (!wasUsed) {
return number
}
}
WATCH
不支持位设置命令。