千家信息网

怎么用java使用redlock

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章将为大家详细讲解有关怎么用java使用redlock,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、在pom文件引入redis和rediss
千家信息网最后更新 2025年01月23日怎么用java使用redlock

这篇文章将为大家详细讲解有关怎么用java使用redlock,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、在pom文件引入redis和redisson依赖:

                                        org.springframework.boot                        spring-boot-starter-data-redis                                                                        org.redisson                        redisson                        3.3.2                

AquiredLockWorker接口类,,主要是用于获取锁后需要处理的逻辑:

/** * Created by fangzhipeng on 2017/4/5. * 获取锁后需要处理的逻辑 */public interface AquiredLockWorker {     T invokeAfterLockAquire() throws Exception;}

二、DistributedLocker 获取锁管理类:

/** * Created by fangzhipeng on 2017/4/5. * 获取锁管理类 */public interface DistributedLocker {     /**      * 获取锁      * @param resourceName  锁的名称      * @param worker 获取锁后的处理类      * @param       * @return 处理完具体的业务逻辑要返回的数据      * @throws UnableToAquireLockException      * @throws Exception      */      T lock(String resourceName, AquiredLockWorker worker) throws UnableToAquireLockException, Exception;      T lock(String resourceName, AquiredLockWorker worker, int lockTime) throws UnableToAquireLockException, Exception;}

nableToAquireLockException ,不能获取锁的异常类:

/** * Created by fangzhipeng on 2017/4/5. * 异常类 */public class UnableToAquireLockException extends RuntimeException {    public UnableToAquireLockException() {    }    public UnableToAquireLockException(String message) {        super(message);    }    public UnableToAquireLockException(String message, Throwable cause) {        super(message, cause);    }}

三、RedissonConnector 连接类:

/** * Created by fangzhipeng on 2017/4/5. * 获取RedissonClient连接类 */@Componentpublic class RedissonConnector {    RedissonClient redisson;    @PostConstruct    public void init(){        redisson = Redisson.create();    }    public RedissonClient getClient(){        return redisson;    }}

四、RedisLocker 类,实现了DistributedLocker:

import org.redisson.api.RLock;import org.redisson.api.RedissonClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/** * Created by fangzhipeng on 2017/4/5. */@Componentpublic class RedisLocker  implements DistributedLocker{    private final static String LOCKER_PREFIX = "lock:";    @Autowired    RedissonConnector redissonConnector;    @Override    public  T lock(String resourceName, AquiredLockWorker worker) throws InterruptedException, UnableToAquireLockException, Exception {        return lock(resourceName, worker, 100);    }    @Override    public  T lock(String resourceName, AquiredLockWorker worker, int lockTime) throws UnableToAquireLockException, Exception {        RedissonClient redisson= redissonConnector.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();    }}

五、测试类:

 @Autowired    RedisLocker distributedLocker;    @RequestMapping(value = "/redlock")    public String testRedlock() throws Exception{        CountDownLatch startSignal = new CountDownLatch(1);        CountDownLatch doneSignal = new CountDownLatch(5);        for (int i = 0; i < 5; ++i) { // create and start threads            new Thread(new Worker(startSignal, doneSignal)).start();        }        startSignal.countDown(); // let all threads proceed        doneSignal.await();        System.out.println("All processors done. Shutdown connection");        return "redlock";    }     class Worker implements Runnable {        private final CountDownLatch startSignal;        private final CountDownLatch doneSignal;        Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {            this.startSignal = startSignal;            this.doneSignal = doneSignal;        }        public void run() {            try {                startSignal.await();                distributedLocker.lock("test",new AquiredLockWorker() {                    @Override                    public Object invokeAfterLockAquire() {                        doTask();                        return null;                    }                });            }catch (Exception e){            }        }        void doTask() {            System.out.println(Thread.currentThread().getName() + " start");            Random random = new Random();            int _int = random.nextInt(200);            System.out.println(Thread.currentThread().getName() + " sleep " + _int + "millis");            try {                Thread.sleep(_int);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName() + " end");            doneSignal.countDown();        }    }

六、运行测试类:

Thread-48 start

Thread-48 sleep 99millis

Thread-48 end

Thread-49 start

Thread-49 sleep 118millis

Thread-49 end

Thread-52 start

Thread-52 sleep 141millis

Thread-52 end

Thread-50 start

Thread-50 sleep 28millis

Thread-50 end

Thread-51 start

Thread-51 sleep 145millis

Thread-51 end

不管怎么样,这是redis官方推荐的一种方案,可靠性比较高。

关于怎么用java使用redlock就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0