redisTemplate #分布式锁# 设置过期时间

喜夏-厌秋 提交于 2020-08-12 03:10:41
<!--导入依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
@Service
@Slf4j
public class RedisService {

@Resource(name = "stringRedisTemplate")
ValueOperations<String, String> valOpsStr;
/**
 * 获取一个redis分布锁
 *
 * @param lockKey        锁住的key
 * @param lockExpireMils 锁住的时长。如果超时未解锁,视为加锁线程死亡,其他线程可夺取锁
 * @return
 */
public boolean getLock(String lockKey, long lockExpireMils) {
    return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
        long nowTime = System.currentTimeMillis();
        Boolean acquire = connection.setNX(lockKey.getBytes(), String.valueOf(nowTime + lockExpireMils + 1).getBytes());
        if (acquire) {
               //覆盖key,设置过期时间
               setStr(lockKey,"",lockExpireMils,TimeUnit.MINUTES);
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    });
}

/**
 * 设置Str缓存
 *  @param key
 * @param val
 * @param unit
 */
public void setStr(String key, String val, Long timeOut, TimeUnit unit) {
    valOpsStr.set(key, val,timeOut,TimeUnit.SECONDS);
}

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!