阿里云 iis 多个网站,网站建设订制版合同模板,偃师企业网站,泡泡h5网页制作问题#xff1a;springboot多实例部署时#xff0c;Scheduled注释的方法重复执行
在 Spring Boot 中要实现 Redis 的SET NX EX命令#xff0c;可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对#xff0c;并同时设置过期时间。
dependen…问题springboot多实例部署时Scheduled注释的方法重复执行
在 Spring Boot 中要实现 Redis 的SET NX EX命令可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对并同时设置过期时间。
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-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 {Autowiredprivate RedisTemplateString, 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;}
}