JedisPool 分布式锁实现
1.JedisPool 分布式锁
package com.ai.runner.qywx.common.utils;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import com.github.jedis.lock.JedisLock;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.util.Pool;
/**
* JedisPool 分布式锁
*
* @author 小凌夏的菜鸟程序员
*/
public class JedisDistributedLock implements Lock {
private final Pool<Jedis> jedisPool;
private final JedisLock lock;
public JedisDistributedLock(Pool<Jedis> jedisPool, String key){
this.jedisPool = jedisPool;
this.lock = new JedisLock(key);
}
@Override
public void lock() {
try (Jedis jedis = jedisPool.getResource()) {
if (!lock.acquire(jedis)) {
throw new RuntimeException("acquire timeouted");
}
} catch (InterruptedException e) {
throw new RuntimeException("lock failed", e);
}
}
@Override
public void lockInterruptibly() throws InterruptedException {
try (Jedis jedis = jedisPool.getResource()) {
if (!lock.acquire(jedis)) {
throw new RuntimeException("acquire timeouted");
}
}
}
@Override
public boolean tryLock() {
try (Jedis jedis = jedisPool.getResource()) {
return lock.acquire(jedis);
} catch (InterruptedException e) {
throw new RuntimeException("lock failed", e);
}
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
try (Jedis jedis = jedisPool.getResource()) {
return lock.acquire(jedis);
}
}
@Override
public void unlock() {
try (Jedis jedis = jedisPool.getResource()) {
lock.release(jedis);
}
}
@Override
public Condition newCondition() {
throw new RuntimeException("unsupported method");
}
}
2.引入jar
<!-- redis分布式锁 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.jedis-lock</groupId>
<artifactId>jedis-lock</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
</dependency>
demo(JedisPool 分布式锁实现)
package com.ai.runner.qywx;
import java.util.concurrent.locks.Lock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.ai.runner.qywx.common.utils.JedisDistributedLock;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.util.Pool;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { Application.class }) // 指定启动类
public class ApplicationTests {
protected String lockKey;
@Autowired
private Pool<Jedis> jedisPool;
@Test
public void test() throws Exception {
Lock lock = new JedisDistributedLock(jedisPool, this.lockKey.concat(":").concat("accessToken"));
lock.lock();
try {
// 拿到锁之后,进行业务处理
} catch (Exception e) {
throw new Exception(e);
} finally {
lock.unlock();
}
}
}