redission用來做分布式鎖比zookeeper更方便,簡單。
引入依賴配置redissionorg.redisson redisson 2.10.7 compile
@Import(SLockAspect.class) //引入AOP配置 @AutoConfigureAfter(RedisAutoConfiguration.class) // 配置Redis @EnableConfigurationProperties(value = {SLockConfig.class}) //自動注冊配置文件 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 就是一個一個注解,基于AOP切面的,SLockConfig.class就是讀入 redission的配置文件
自主義注解 SLock@Target(value = {ElementType.METHOD}) @Retention(value = RetentionPolicy.RUNTIME) public @interface SLock { /** * 鎖名稱 * * @return */ String name() default ""; /** * 鎖類型,默認Fair公平鎖 * * @return */ LockType lockType() default LockType.FAIR; /** * 嘗試加鎖等待時長,默認 Long.MIN_VALUE * * @return */ long waitTime() default Long.MIN_VALUE; /** * 自動解鎖時長,默認 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 ; }
當多線程測試的時候,下一個線程總會等到上一個線程完成后再繼續。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68339.html
摘要:不過比較膚淺,為了進一步加深對的認識,我利用空閑時間編寫了本篇文章對應的基于的分布式鎖實現。不過我所編寫的分布式鎖還是比較簡陋的,實現的也不夠優美,僅僅是個練習,僅供參考使用。好了,題外話就說到這里,接下來我們就來聊聊基于的分布式鎖實現。 1. 背景 最近在學習 Zookeeper,在剛開始接觸 Zookeeper 的時候,完全不知道 Zookeeper 有什么用。且很多資料都是將 Z...
摘要:集群實現分布式鎖上面的討論中我們有一個非常重要的假設是單點的。但是其實這已經超出了實現分布式鎖的范圍,單純用沒有命令來實現生成。這個問題用實現分布式鎖暫時無解。結論并不能實現嚴格意義上的分布式鎖。 關于Redis實現分布式鎖的問題,網絡上很多,但是很多人的討論基本就是把原來博主的貼過來,甚至很多面試官也是一知半解經不起推敲就來面候選人,最近結合我自己的學習和資料查閱,整理一下用Redi...
摘要:分布式鎖基于實現分布式鎖思考幾個問題鎖為什么不能應用于分布式鎖雖然能夠解決同步問題,但是每次只有一個線程訪問,并且鎖屬于鎖,僅適用于單點部署然而分布式需要部署多臺實例,屬于不同的線程對象使用中實現分布式鎖。分布式鎖基于redis實現分布式鎖思考幾個問題?synchronized鎖為什么不能應用于分布式鎖?synchronized雖然能夠解決同步問題,但是每次只有一個線程訪問,并且synchr...
閱讀 2928·2021-11-23 09:51
閱讀 3173·2021-11-12 10:36
閱讀 3211·2021-09-27 13:37
閱讀 3163·2021-08-17 10:15
閱讀 2593·2019-08-30 15:55
閱讀 2755·2019-08-30 13:07
閱讀 797·2019-08-29 16:32
閱讀 2650·2019-08-26 12:00