如何在Redis缓存中为竞争条件设置TTL

时间:2018-06-19 10:01:03

标签: redis spring-data-redis

我在我的应用程序中使用Redis进行缓存,该应用程序在spring beans,spring-data-redis 1.7.1,jedis 2.9.0中配置。 我想知道如何在配置中设置竞争条件ttl。

如果您有任何建议,请发表评论。

1 个答案:

答案 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。