redis - 如何为 Redis 缓存中的竞争条件设置 TTL

标签 redis spring-data-redis

我在我的应用程序中使用 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/

相关文章:

django - 我想将 django 与 celery (redis) 一起使用。我需要在 django 应用程序的服务器上安装 redis 吗?或者我可以有一个单独的redis服务器吗?

redis - 为什么一个键在Redis中的编码是 "int",而在lua脚本中它的类型是 "string"?

Redis 的 Spring Data : when dealing with values, 是否仅适用于 StringRedisTemplate?

Django RQ rqworker 无限期卡住

c++ - RedisClient 通过 EVAL 命令使用 Lua 脚本

java - 不支持 JedisCluster 的管道

spring-boot - Redis 在使用 Spring Boot 时将对象设置为空 json "{}"

java - Redis - 过期索引不会被删除

spring-cache - 使用 Jackson 序列化程序 : How to deal with multiple type of domain object 的带有 Redis 的 Spring 缓存

redis 服务器关闭并重新启动后的 redis key 不可用