get yourkey
(nil)
get <yourkey>::lock
// if (nil) then calculate, if t then wait. assuming (nil) here
setex <yourkey>::lock 30 t
OK
// calcultions
set <yourkey> <result>
OK
del <yourkey>::lock
(integer) 1
这里使用 setex 设置锁定键,TTL为30秒 . 如果需要,你可以放另一个TTL .
上面的代码存在一个问题 - 在检查锁定并获取锁定之前会有一些时间过去 . 要正确获取锁定,可以使用EVAL: eval "local lk=KEYS[1]..'::lock' local lock=redis.call('get',lk) if (lock==false) then redis.call('setex',lk,KEYS[2],'t') return 1 else return 0 end" 2 <yourkey> 30 如果没有锁定或者放置锁定并返回1,则返回0 .
1 回答
如果我理解你的话,你需要和Ruby repo一样,但是在Java中 .
对于这种情况,您可能需要在所需的密钥上放置技术锁定密钥 .
这里使用
setex
设置锁定键,TTL为30秒 . 如果需要,你可以放另一个TTL .上面的代码存在一个问题 - 在检查锁定并获取锁定之前会有一些时间过去 . 要正确获取锁定,可以使用EVAL:
eval "local lk=KEYS[1]..'::lock' local lock=redis.call('get',lk) if (lock==false) then redis.call('setex',lk,KEYS[2],'t') return 1 else return 0 end" 2 <yourkey> 30
如果没有锁定或者放置锁定并返回1,则返回0 .