使用Redisson实现分布式锁

在集群环境中实现分布式锁有很多方法,最常见的是使用数据库(大部分数据库都有內建的锁或原子操作)或zookeeper管理共享资源。如果不想搭建zookeeper集群或者未来有计划更换数据库,使用Redis是一个不错的方案。

Redis支持setnx锁定key。而Redisson是一个非常不错的java开源Redis客户端,它实现了Redis锁。

我们首先定义一个分布式锁接口(面向接口编程,对不同的分布式锁实现提供不同的实现类)。

public interface DistributedLocker {
    public <T> T lock(String resourceName,
        AquiredLockWorker<T> worker) throws UnableToAquireLockException, Exception;

    public <T> T lock(String resourceName,
        AquiredLockWorker<T> worker, int lockTime) throws
 UnableToAquireLockException, Exception;
}
public interface AquiredLockWorker<T> {
    public T invokeAfterLockAquire() throws Exception;
}

以下是基于Resisson和Redis的分布式锁实现

@Component
public class RedisLocker implements DistributedLocker{

    private final static String LOCKER_PREFIX = "lock:";

    @Autowired
    private RedissonConnector rdsConnector;

    @Override
    public <T> T lock(String resourceName, AquiredLockWorker<T> worker)
throws InterruptedException, UnableToAquireLockException, Exception {

    return lock(resourceName, worker, 100);
}

    @Override
    public <T> T lock(String resourceName, AquiredLockWorker<T> worker,
int lockTime) throws UnableToAquireLockException,
Exception {
        RedissonClient redisson = rdsConnector.getClient();

        RLock lock = redisson.getLock(LOCKER_PREFIX + resourceName);

// Wait for 100 seconds seconds and automatically   unlock it after lockTime seconds
    boolean success = lock.tryLock(100, lockTime, TimeUnit.SECONDS);;
    if (success) {
    try {
        return worker.invokeAfterLockAquire();
    } finally {
    lock.unlock();
    }
    }
    throw new UnableToAquireLockException();
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值