我在我的应用程序中使用 Redis 作为缓存,它是在 spring beans、spring-data-redis 1.7.1、jedis 2.9.0 中配置的。 我想知道如何在配置中设置竞争条件 ttl。
有什么建议欢迎评论。
最佳答案
如果我没理解错的话,您想要的是与 Ruby 存储库相同的内容,但在 Java 中。
对于这种情况,您可能希望在您需要的那个旁边放一把技术锁定 key 。
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。
关于redis - 如何为 Redis 缓存中的竞争条件设置 TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925612/