当前位置: 首页 > 科技观察

Java 从零实现属于你的 Redis 分布式锁_0

时间:2023-03-14 17:15:15 科技观察

Java从零开始实现你的Redis分布式锁Lock(3)ReadWriteLock读写锁(4)ReenTrantLock可重入锁等,这些锁给我们提供了极大的方便,保证了多线程情况下的线程安全。但是在分布式系统中,上面的锁都是无用的。如果要解决分布式系统中的并发问题,就需要引入分布式锁的概念。创建java代码实现的动机首先是为了体会锁实现的原理,理论指导实践,实践完善理论。晚上有很多关于redis分布式锁的文章,但是都参差不齐。Redis分布式锁工具有时候中间件团队可能没有提供,即使提供了也不一定经常维护。不如自己实现一个,知道原理,方便修改。接口定义为了方便和JDK复用,我们让接口继承自jdk的Lock接口。packagecom.github.houbb.lock.api.core;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.locks.Lock;/***锁定义*@authorbinbin.hou*@since0.0.1*/publicinterfaceILockextendsLock{/***当*@paramkeykey*@return返回*@throwsInterruptedException*@since0.0.1*时尝试锁定*@paramtimetime*@paramunit/booleantryLock(longtime,TimeUnitunit,Stringkey)throwsInterruptedException;/***尝试加锁*@paramkeykey*@returnreturn*@since0.0.1*/booleantryLock(Stringkey);/***解锁*@paramkeykey*@since0.0.1*/voidunlock(Stringkey);}方法我们只增加了三个比较常用的方法核心方法,作为第一个版本,更简单。您可以稍后添加。抽象实现为了方便后面增加更多的实现,这里先实现一个通用的抽象父类。packagecom.github.houbb.lock.redis.core;importcom.github.houbb.lock.api.core.ILock;importcom.github.houbb.lock.redis.constant.LockRedisConst;importcom.github.houbb.wait.api。IWait;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.locks.Condition;/***抽像现实*@authorbinbin.hou*@since0.0.1*/publicabstractclassAbstractLockRedisimplementsILock{/***锁等待*@since0.0.1*/privatefinalIWaitwait;protectedAbstractLockRedis(IWaitwait){this.wait=wait;}@Overridepublicvoidlock(){thrownewUnsupportedOperationException();}@OverridepublicvoidlockInterruptibly()throwsInterruptedException{thrownewUnsupportedOperationException();}@OverridepublicbooleantryLock(){returntryLock(LockRedisConst.DEFAULT);}@Overridepublicvoidunlock(){unlock(LockRedisConst.DEFAULT_KEY);}@OverridepublicbooleantryLock(longtime,TimeUnitunit,Stringkey)throwsInterruptedException{longstartTimeMills=System.currentTimeMillis();//一次获取,直接成功booleanresult=this.tryLock(key);if(结果){返回真;}//时间判断if(time<=0){returnfalse;}longdurationMills=unit.toMillis(time);longendMills=startTimeMillis+durationMills;//循环等待while(System.currentTimeMillis()com.github.houbblock-core0.0.1测试代码Jedisjedis=newJedis("127.0.0.1",6379);IOperatoroperator=newJedisOperator(jedis);//获取锁ILocklock=LockRedisBs.newInstance().operator(operator).lock();try{booleanlockResult=lock.tryLock();System.出去。println(lockResult);//业务处理}catch(Exceptione){e.printStackTrace();}finally{lock.unlock();}总结到这里,实现了一个简单版的redis分布式锁。当然还有很多可以改进的地方:(1)比如引入增量序列,避免分布式锁GC带来的问题(2)支持更多的redisserver+clients(3)对于注解的redis分布式锁定支持

最新推荐
猜你喜欢