package com.aps.common.redis.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; import java.time.Duration; import java.util.Collections; /** * Redis 分布式锁 * **/ @Component public class RedisLockUtils { @Autowired private RedisTemplate redisTemplate; //分布式锁过期时间 s 可以根据业务自己调节 private static final Long LOCK_REDIS_TIMEOUT = 10L; //分布式锁休眠 至 再次尝试获取 的等待时间 ms 可以根据业务自己调节 public static final Long LOCK_REDIS_WAIT = 500L; /** * 判断是否存在锁 * */ public boolean existLock(String key,String value){ if(null==this.redisTemplate.opsForValue().get(key)){ return false; } return this.redisTemplate.opsForValue().get(key).equals(value); } /** * 加锁 **/ public Boolean getLock(String key,String value,Long timeoutSeconds){ Boolean lockStatus = this.redisTemplate.opsForValue().setIfAbsent(key,value, Duration.ofSeconds(timeoutSeconds)); return lockStatus; } /** * 释放锁 **/ public Long releaseLock(String key,String value){ String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; RedisScript redisScript = new DefaultRedisScript<>(luaScript,Long.class); Long releaseStatus = (Long)this.redisTemplate.execute(redisScript, Collections.singletonList(key),value); return releaseStatus; } }