2020-12-10

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();
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值