我在我的应用程序中使用Redis进行缓存,该应用程序在spring beans,spring-data-redis 1.7.1,jedis 2.9.0中配置。 我想知道如何在配置中设置竞争条件ttl。
如果您有任何建议,请发表评论。
答案 0 :(得分:0)
如果我理解的正确,那么您想要的是与Ruby存储库相同的内容,但使用Java。
在这种情况下,您可能需要将技术锁钥匙放在所需的钥匙旁边。
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
,如果没有锁,则返回0,或者放置锁并返回1。