基于Redisson的分布式锁

2019-04-13  本文已影响0人  neko_11

1、概述

什么是分布式锁?在分布式系统中,常常需要协调各个系统的动作,保证事务的一致性或者避免重复执行相同操作。如果不同的系统或是同一个系统的不同主机之间需要共享同一资源,那么系统在访问这些资源的时候,往往需要互斥来防止彼此干扰,避免造成各系统的资源不一致,这个时候,便需要使用到分布式锁。Redisson基于redis提供了我们常用的一些锁。

redisson官方发布了redisson-spring-boot-starter,具体可以参考:gitHub文档

redisson最新依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.10.5</version>
</dependency>

2、特点

3、锁类型

    public void ReentrantLock(RedissonClient redisson) {
        RLock lock = redisson.getLock("test");
        try {
            // 加锁
//            lock.lock();
            // 若没有手动释放锁,10秒钟以后自动解锁
//            lock.lock(10, TimeUnit.SECONDS);
            // 尝试加锁,最多等待3秒,上锁以后60秒自动解锁
            boolean res = lock.tryLock(3, 60, TimeUnit.SECONDS);
            if (res) { //成功
                // do something
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 手动解锁
            lock.unlock();
        }
    }

RLock继承了org.redisson.api.RLockAsync,支持异步执行

    public void AsynReentrantLock(RedissonClient redisson) {
        RLock lock = redisson.getLock("test");
        try {
//            lock.lockAsync();
//            lock.lockAsync(10, TimeUnit.SECONDS);
            Future<Boolean> res = lock.tryLockAsync(3, 60, TimeUnit.SECONDS);
            if (res.get()) {
                // do something
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    public void FairLock(RedissonClient redisson) {
        RLock fairLock = redisson.getFairLock("test");
        try {
//            fairLock.lock();
//            fairLock.lock(10, TimeUnit.SECONDS);
            // 尝试加锁,最多等待3秒,上锁以后60秒自动解锁
            boolean res = fairLock.tryLock(3, 60, TimeUnit.SECONDS);
            if (res) { //成功
                // do something
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            fairLock.unlock();
        }
    }
    public void MultiLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){
        RLock lock1 = redisson1.getLock("lock1");
        RLock lock2 = redisson2.getLock("lock2");
        RLock lock3 = redisson3.getLock("lock3");
        RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
        try {
            // 同时加锁lock1 lock2 lock3, 所有的锁都上锁成功才算成功。
            lock.lock();
            // 尝试加锁,最多等待10秒,上锁以后60秒自动解锁
            boolean res = lock.tryLock(10, 60, TimeUnit.SECONDS);
            if (res) { //成功
                // do something
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
public void RedLock(RedissonClient redisson1, RedissonClient redisson2, RedissonClient redisson3) {
        RLock lock1 = redisson1.getLock("lock1");
        RLock lock2 = redisson2.getLock("lock2");
        RLock lock3 = redisson3.getLock("lock3");
        RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
        try {
            // 同时加锁:lock1 lock2 lock3, 红锁在大部分节点上加锁成功就算成功。
            lock.lock();
            // 尝试加锁,最多等待10秒,上锁以后60秒自动解锁
            boolean res = lock.tryLock(10, 60, TimeUnit.SECONDS);
            if (res) { //成功
                // do something
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
public void ReadLock(RedissonClient redisson){
        RReadWriteLock rwlock = redisson.getReadWriteLock("test");
        try {
            rwlock.readLock().lock();
            // 10秒钟以后自动解锁
            rwlock.readLock().lock(10, TimeUnit.SECONDS);
            // 尝试加锁,最多等待10秒,上锁以后60秒自动解锁
            boolean res = rwlock.readLock().tryLock(10, 60, TimeUnit.SECONDS);
            if (res) { //成功
                // do something
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            rwlock.readLock().unlock();
        }
    }

    public void WriteLock(RedissonClient redisson){
        RReadWriteLock rwlock = redisson.getReadWriteLock("test");
        try {
            rwlock.writeLock().lock();
            // 10秒钟以后自动解锁
            rwlock.writeLock().lock(10, TimeUnit.SECONDS);
            // 尝试加锁,最多等待10秒,上锁以后60秒自动解锁
            boolean res = rwlock.writeLock().tryLock(10, 60, TimeUnit.SECONDS);
            if (res) { //成功
                // do something
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            rwlock.writeLock().unlock();
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读