首页 文章

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

提问于
浏览
-1

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

如果您有任何建议,请评论 .

1 回答

  • 0

    如果我理解你的话,你需要和Ruby repo一样,但是在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 如果没有锁定或者放置锁定并返回1,则返回0 .

相关问题