redission用來做分布式鎖比zookeeper更方便,簡單。
引入依賴配置redissionorg.redisson redisson 2.10.7 compile
@Import(SLockAspect.class) //引入AOP配置 @AutoConfigureAfter(RedisAutoConfiguration.class) // 配置Redis @EnableConfigurationProperties(value = {SLockConfig.class}) //自動(dòng)注冊配置文件 public class RedissionAutoConfig { @Resource private SLockConfig sLockConfig; @Bean(destroyMethod = "shutdown") @ConditionalOnMissingBean(name = "redission") public RedissonClient redission() { Config config = new Config(); config.useSingleServer() .setPassword(this.sLockConfig.getPassword()) .setAddress(this.sLockConfig.getAddress()); return Redisson.create(config); } @Bean public LockInfoProvider lockInfoProvider() { return new LockInfoProvider(); } @Bean public SLockFactory sLockFactory() { return new SLockFactory(); } }
其中 SLockAspect.class 就是一個(gè)一個(gè)注解,基于AOP切面的,SLockConfig.class就是讀入 redission的配置文件
自主義注解 SLock@Target(value = {ElementType.METHOD}) @Retention(value = RetentionPolicy.RUNTIME) public @interface SLock { /** * 鎖名稱 * * @return */ String name() default ""; /** * 鎖類型,默認(rèn)Fair公平鎖 * * @return */ LockType lockType() default LockType.FAIR; /** * 嘗試加鎖等待時(shí)長,默認(rèn) Long.MIN_VALUE * * @return */ long waitTime() default Long.MIN_VALUE; /** * 自動(dòng)解鎖時(shí)長,默認(rèn) Long.MIN_VALUE * * @return */ long releaseTime() default Long.MIN_VALUE; enum LockType { /** * 可重入鎖 */ REENTRANT, /** * 公平鎖 */ FAIR, /** * 讀鎖 */ READ, /** * 寫鎖 */ WRITE, } }測試
@GetMapping("/{id}") @SLock(name = "BB",waitTime = Long.MAX_VALUE, releaseTime = 5) public String hello(@PathVariable Long id){ Long counter = redisTemplate.opsForValue().increment("COUNTER", 1); try { log.info(id +" locked and begin..."); Thread.sleep(5000); ////模擬處理過程 do something. } catch (Exception ex) { log.error("Error occurred"); } finally { log.info(id +" unlocked..."); } return "lock-" + id ; }
當(dāng)多線程測試的時(shí)候,下一個(gè)線程總會(huì)等到上一個(gè)線程完成后再繼續(xù)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68339.html
摘要:不過比較膚淺,為了進(jìn)一步加深對的認(rèn)識,我利用空閑時(shí)間編寫了本篇文章對應(yīng)的基于的分布式鎖實(shí)現(xiàn)。不過我所編寫的分布式鎖還是比較簡陋的,實(shí)現(xiàn)的也不夠優(yōu)美,僅僅是個(gè)練習(xí),僅供參考使用。好了,題外話就說到這里,接下來我們就來聊聊基于的分布式鎖實(shí)現(xiàn)。 1. 背景 最近在學(xué)習(xí) Zookeeper,在剛開始接觸 Zookeeper 的時(shí)候,完全不知道 Zookeeper 有什么用。且很多資料都是將 Z...
摘要:集群實(shí)現(xiàn)分布式鎖上面的討論中我們有一個(gè)非常重要的假設(shè)是單點(diǎn)的。但是其實(shí)這已經(jīng)超出了實(shí)現(xiàn)分布式鎖的范圍,單純用沒有命令來實(shí)現(xiàn)生成。這個(gè)問題用實(shí)現(xiàn)分布式鎖暫時(shí)無解。結(jié)論并不能實(shí)現(xiàn)嚴(yán)格意義上的分布式鎖。 關(guān)于Redis實(shí)現(xiàn)分布式鎖的問題,網(wǎng)絡(luò)上很多,但是很多人的討論基本就是把原來博主的貼過來,甚至很多面試官也是一知半解經(jīng)不起推敲就來面候選人,最近結(jié)合我自己的學(xué)習(xí)和資料查閱,整理一下用Redi...
摘要:分布式鎖基于實(shí)現(xiàn)分布式鎖思考幾個(gè)問題鎖為什么不能應(yīng)用于分布式鎖雖然能夠解決同步問題,但是每次只有一個(gè)線程訪問,并且鎖屬于鎖,僅適用于單點(diǎn)部署然而分布式需要部署多臺實(shí)例,屬于不同的線程對象使用中實(shí)現(xiàn)分布式鎖。分布式鎖基于redis實(shí)現(xiàn)分布式鎖思考幾個(gè)問題?synchronized鎖為什么不能應(yīng)用于分布式鎖?synchronized雖然能夠解決同步問題,但是每次只有一個(gè)線程訪問,并且synchr...
閱讀 2947·2021-11-23 09:51
閱讀 3200·2021-11-12 10:36
閱讀 3233·2021-09-27 13:37
閱讀 3193·2021-08-17 10:15
閱讀 2615·2019-08-30 15:55
閱讀 2781·2019-08-30 13:07
閱讀 814·2019-08-29 16:32
閱讀 2672·2019-08-26 12:00