【问题标题】:How to set TTL for race conditions in Redis cache如何在 Redis 缓存中为竞争条件设置 TTL
【发布时间】:2018-06-19 10:01:02
【问题描述】:

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

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

【问题讨论】:

  • 解释一下竞态条件和竞态条件 ttl 是什么意思。
  • 竞态条件 ttl 是在 key 到期时锁定 key 以重新计算。它可以防止多个进程尝试同时重新填充同一个键。

标签: redis spring-data-redis


【解决方案1】:

如果我没听错的话,你想要的和那个 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 &lt;yourkey&gt; 30 如果没有锁则返回 0,或者放置锁并返回 1。

【讨论】:

  • 是的,但它说默认锁定时间是 30s 。我想覆盖该锁定时间..也许将其减少到 10 秒。
  • 把10作为setex的第二个参数
  • 如何在spring bean配置中设置...??我可以在 spring bean 中设置过期和最大重定向......以同样的方式我也在寻找竞争条件 ttl
  • 不知道spring-data-redis有没有这个功能。您可能必须手动完成。
  • 我发现了一个未回答的问题 (stackoverflow.com/questions/47052312/…),它暗示同步更新在 spring-data-cache 中根本不起作用。但从那以后它可能已经改变了。
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2015-01-30
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
相关资源
最近更新 更多