首页 > 代码库 > 一个Redis实现的分布式锁
一个Redis实现的分布式锁
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Componentpublic class RedisLock { private static final Logger LOGGER = LoggerFactory.getLogger(RedisLock.class); @Autowired protected RedisTemplate<String, String> redisTemplate; private static final long DEFAULT_WAIT_LOCK_TIME_OUT = 60000;//60s 有慢sql,超时时间设置长一点 private static final long DEFAULT_EXPIRE = 80;//80s 有慢sql,超时时间设置长一点 /** * 等待锁的时间,单位为ms * * @param key * @param timeout ms */ public void lock(String key, long timeout) { String lockKey = generateLockKey(key); long start = System.currentTimeMillis(); try { while ((System.currentTimeMillis() - start) < timeout) { if (redisTemplate.getConnectionFactory().getConnection().setNX(lockKey.getBytes(), new byte[0])) { redisTemplate.expire(lockKey, DEFAULT_EXPIRE, TimeUnit.SECONDS);//暂设置为80s过期,防止异常中断锁未释放 if (LOGGER.isDebugEnabled()) { LOGGER.debug("add RedisLock[" + key + "]."); } break; } TimeUnit.SECONDS.sleep(3); } } catch (Exception e) { unlock(lockKey); } } public void unlock(String key) { String lockKey = generateLockKey(key); if (LOGGER.isDebugEnabled()) { LOGGER.debug("release RedisLock[" + lockKey + "]."); } RedisConnection connection = redisTemplate.getConnectionFactory().getConnection(); connection.del(lockKey.getBytes()); connection.close(); } private String generateLockKey(String key) { return String.format("LOCK:%s", key); } public void lock(String key) { lock(key, DEFAULT_WAIT_LOCK_TIME_OUT); }}
一个Redis实现的分布式锁
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。