主页 > 手机  > 

springboot多实例部署时,@Scheduled注释的方法重复执行

springboot多实例部署时,@Scheduled注释的方法重复执行

问题:springboot多实例部署时,@Scheduled注释的方法重复执行

在 Spring Boot 中要实现 Redis 的SET NX EX命令,可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对,并同时设置过期时间。

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies>

当spring-boot-starter-data-redis依赖版本比较旧时,可以使用使用 Lua 脚本实现 SET NX EX,前提是不使用redis集群。 org.springframework.dao.InvalidDataAccessApiUsageException: EvalSha is not supported in cluster environment 异常时,这是因为在 Redis 集群环境下,EvalSha 命令存在一定限制,Spring Data Redis 在执行 Lua 脚本 时默认可能会尝试使用 EvalSha 命令,而该命令在集群环境中并不总是被支持。 或者分两步操作 先使用 SETNX 尝试设置键值对,若设置成功再使用 EXPIRE 设置过期时间。但这种方式不是原子操作,在 SETNX 和 EXPIRE 之间可能会出现异常,导致锁没有设置过期时间,造成死锁。

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service public class RedisLockServiceV2 { @Autowired private RedisTemplate<String, String> redisTemplate; public boolean setNXEX(String key, String value, long timeout, TimeUnit timeUnit) { Boolean setResult = redisTemplate.opsForValue().setIfAbsent(key, value); if (setResult != null && setResult) { redisTemplate.expire(key, timeout, timeUnit); return true; } return false; } }
标签:

springboot多实例部署时,@Scheduled注释的方法重复执行由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“springboot多实例部署时,@Scheduled注释的方法重复执行