色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Spring Integration實現(xiàn)分布式鎖

數(shù)據(jù)分析與開發(fā) ? 來源:JAVA日知錄 ? 作者:飄渺Jam ? 2022-05-13 15:42 ? 次閱讀

概述

提到分布式鎖大家都會想到如下兩種:

  • 基于Redisson組件,使用redlock算法實現(xiàn)
  • 基于Apache Curator,利用Zookeeper的臨時順序節(jié)點模型實現(xiàn)

今天我們來說說第三種,使用Spring Integration實現(xiàn)。

Spring Integration在基于Spring的應(yīng)用程序中實現(xiàn)輕量級消息傳遞,并支持通過聲明適配器與外部系統(tǒng)集成。

Spring Integration的主要目標是提供一個簡單的模型來構(gòu)建企業(yè)集成解決方案,同時保持關(guān)注點的分離,這對于生成可維護,可測試的代碼至關(guān)重要。我們熟知的 Spring Cloud Stream的底層就是Spring Integration。

官方地址:https://github.com/spring-projects/spring-integration

Spring Integration提供的全局鎖目前為如下存儲提供了實現(xiàn):

  • Gemfire
  • JDBC
  • Redis
  • Zookeeper

它們使用相同的API抽象,這意味著,不論使用哪種存儲,你的編碼體驗是一樣的。試想一下你目前是基于zookeeper實現(xiàn)的分布式鎖,哪天你想換成redis的實現(xiàn),我們只需要修改相關(guān)依賴和配置就可以了,無需修改代碼。下面是你使用Spring Integration實現(xiàn)分布式鎖時需要關(guān)注的方法:

方法名 描述
lock() Acquires the lock.加鎖,如果已經(jīng)被其他線程鎖住或者當(dāng)前線程不能獲取鎖則阻塞
lockInterruptibly() Acquires the lock unless the current thread is interrupted.加鎖,除非當(dāng)前線程被打斷。
tryLock() Acquires the lock only if it is free at the time of invocation.嘗試加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
tryLock(long time, TimeUnit unit) Acquires the lock if it is free within the given waiting time and the current thread has not been interrupted.嘗試在指定時間內(nèi)加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
unlock() Releases the lock.解鎖

實戰(zhàn)

話不多說,我們看看使用Spring Integration如何基于redis和zookeeper快速實現(xiàn)分布式鎖,至于Gemfire 和 Jdbc的實現(xiàn)大家自行實踐。

基于Redis實現(xiàn)

  • 引入相關(guān)組件

	

org.springframework.boot
spring-boot-starter-integration



org.springframework.integration
spring-integration-redis



org.springframework.boot
spring-boot-starter-data-redis
  • 在application.yml中添加redis的配置

	
spring:
redis:
host:172.31.0.149
port:7111
  • 建立配置類,注入RedisLockRegistry

	
@Configuration
publicclassRedisLockConfiguration{

@Bean
publicRedisLockRegistryredisLockRegistry(RedisConnectionFactoryredisConnectionFactory){
returnnewRedisLockRegistry(redisConnectionFactory,"redis-lock");
}

}
  • 編寫測試代碼

	
@RestController
@RequestMapping("lock")
@Log4j2
publicclassDistributedLockController{
@Autowired
privateRedisLockRegistryredisLockRegistry;

@GetMapping("/redis")
publicvoidtest1(){
Locklock=redisLockRegistry.obtain("redis");
try{
//嘗試在指定時間內(nèi)加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
if(lock.tryLock(3,TimeUnit.SECONDS)){
log.info("lockisready");
TimeUnit.SECONDS.sleep(5);
}
}catch(InterruptedExceptione){
log.error("obtainlockerror",e);
}finally{
lock.unlock();
}
}
}
  • 測試
    啟動多個實例,分別訪問/lock/redis端點,一個正常秩序業(yè)務(wù)邏輯,另外一個實例訪問出現(xiàn)如下錯誤c7fdd5d0-cb61-11ec-bce3-dac502259ad0.png說明第二個實例沒有拿到鎖,證明了分布式鎖的存在。

注意,如果使用新版Springboot進行集成時需要使用Redis4版本,否則會出現(xiàn)下面的異常告警,主要是unlock()釋放鎖時使用了UNLINK命令,這個需要Redis4版本才能支持。


	
2020-05-141124,781WARNRedisLockRegistry:339-TheUNLINKcommandhasfailed(notsupportedontheRedisserver?);fallingbacktotheregularDELETEcommand
org.springframework.data.redis.RedisSystemException:Errorinexecution;nestedexceptionisio.lettuce.core.RedisCommandExecutionException:ERRunknowncommand'UNLINK'

基于Zookeeper實現(xiàn)

  • 引入組件

	

org.springframework.boot
spring-boot-starter-integration



org.springframework.integration
spring-integration-zookeeper
  • 在application.yml中添加zookeeper的配置

	
zookeeper:
host:172.31.0.43:2181
  • 建立配置類,注入ZookeeperLockRegistry

	
@Configuration
publicclassZookeeperLockConfiguration{
@Value("${zookeeper.host}")
privateStringzkUrl;


@Bean
publicCuratorFrameworkFactoryBeancuratorFrameworkFactoryBean(){
returnnewCuratorFrameworkFactoryBean(zkUrl);
}

@Bean
publicZookeeperLockRegistryzookeeperLockRegistry(CuratorFrameworkcuratorFramework){
returnnewZookeeperLockRegistry(curatorFramework,"/zookeeper-lock");
}
}
  • 編寫測試代碼

	
@RestController
@RequestMapping("lock")
@Log4j2
publicclassDistributedLockController{

@Autowired
privateZookeeperLockRegistryzookeeperLockRegistry;

@GetMapping("/zookeeper")
publicvoidtest2(){
Locklock=zookeeperLockRegistry.obtain("zookeeper");
try{
//嘗試在指定時間內(nèi)加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
if(lock.tryLock(3,TimeUnit.SECONDS)){
log.info("lockisready");
TimeUnit.SECONDS.sleep(5);
}
}catch(InterruptedExceptione){
log.error("obtainlockerror",e);
}finally{
lock.unlock();
}
}
}
測試
啟動多個實例,分別訪問/lock/zookeeper端點,一個正常秩序業(yè)務(wù)邏輯,另外一個實例訪問出現(xiàn)如下錯誤c81884ca-cb61-11ec-bce3-dac502259ad0.png
說明第二個實例沒有拿到鎖,證明了分布式鎖的存在。

原文標題:這樣實現(xiàn)分布式鎖,才叫優(yōu)雅!

文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 分布式
    +關(guān)注

    關(guān)注

    1

    文章

    895

    瀏覽量

    74498
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14340

原文標題:這樣實現(xiàn)分布式鎖,才叫優(yōu)雅!

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Redis 分布式的正確實現(xiàn)方式

    分布式一般有三種實現(xiàn)方式:1. 數(shù)據(jù)庫樂觀;2. 基于Redis的分布式;3. 基于Zoo
    的頭像 發(fā)表于 05-31 14:19 ?3588次閱讀

    Java:Redis分布式的原理和案例

    要介紹分布式,首先要提到與分布式鎖相對應(yīng)的是線程、進程
    的頭像 發(fā)表于 07-01 11:49 ?3868次閱讀

    分布式的基本原理和案例實現(xiàn)

    前面我們有聊過樂觀和悲觀實現(xiàn),均是對于單體架構(gòu)的場景下的實現(xiàn)。那么現(xiàn)在我們來總結(jié)看下分布式情況下如何
    的頭像 發(fā)表于 07-01 14:53 ?3328次閱讀
    <b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>的基本原理和案例<b class='flag-5'>實現(xiàn)</b>

    分布式的設(shè)計與實現(xiàn)

    今天跟大家探討一下分布式的設(shè)計與實現(xiàn)。希望對大家有幫助,如果有不正確的地方,歡迎指出,一起學(xué)習(xí),一起進步哈。
    的頭像 發(fā)表于 05-13 15:36 ?1748次閱讀

    深入理解redis分布式

    深入理解redis分布式 哈嘍,大家好,我是指北君。 本篇文件我們來介紹如何Redis實現(xiàn)分布式的演進過程,以及為什么不能直接用Setn
    的頭像 發(fā)表于 10-08 14:13 ?949次閱讀
    深入理解redis<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>

    Redis實現(xiàn)分布式的幾種方案

    本文將介紹什么是分布式,以及使用Redis實現(xiàn)分布式的幾種方案。 前言 了解分布式
    的頭像 發(fā)表于 10-11 15:19 ?677次閱讀

    什么是分布式 Redis的五種分布式方案

    本地加鎖的方式在分布式的場景下不適用,所以本文我們來探討下如何引入分布式解決本地的問題。本篇所有代碼和業(yè)務(wù)基于我的開源項目 PassJava。
    發(fā)表于 10-23 11:35 ?1174次閱讀
    什么是<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b> Redis的五種<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>方案

    tldb提供分布式使用方法

    前言:分布式分布式系統(tǒng)中一個極為重要的工具。目前有多種分布式的設(shè)計方案,比如借助 redis,mq,數(shù)據(jù)庫,zookeeper 等第三
    的頭像 發(fā)表于 11-02 14:44 ?890次閱讀
    tldb提供<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>使用方法

    spring分布式框架有哪些

    Spring分布式框架是一套基于Spring框架的解決方案,用于構(gòu)建分布式系統(tǒng)。它提供了一系列的組件和模塊,可以幫助開發(fā)人員輕松地構(gòu)建可擴展、高可用、高性能的
    的頭像 發(fā)表于 11-16 10:58 ?773次閱讀

    springcloud如何實現(xiàn)分布式

    ,我們可以快速搭建分布式系統(tǒng),并且靈活地進行伸縮和擴展。 要實現(xiàn)分布式系統(tǒng),我們可以按照以下步驟來使用Spring Cloud: 服務(wù)注冊與發(fā)現(xiàn):
    的頭像 發(fā)表于 11-16 11:01 ?679次閱讀

    redis分布式如何實現(xiàn)

    Redis分布式是一種基于Redis實現(xiàn)的機制,可以用于多個進程或多臺服務(wù)器之間對共享資源的并發(fā)訪問控制。在分布式系統(tǒng)中,由于多個進程或多臺服務(wù)器同時訪問共享資源,可能會發(fā)生數(shù)據(jù)競爭
    的頭像 發(fā)表于 11-16 11:29 ?525次閱讀

    redis分布式死鎖處理方案

    引言: 隨著分布式系統(tǒng)的廣泛應(yīng)用,尤其是在大規(guī)模并發(fā)操作下,對并發(fā)控制的需求越來越高。Redis分布式作為一種常見的分布式
    的頭像 發(fā)表于 11-16 11:44 ?1748次閱讀

    redis分布式三個方法

    的三種常見的分布式實現(xiàn)方法:基于SETNX命令的簡單分布式、基于SET命令的帶過期時間的分布式
    的頭像 發(fā)表于 12-04 11:22 ?1457次閱讀

    如何實現(xiàn)Redis分布式

    機制,下面將詳細介紹如何實現(xiàn)Redis分布式。 一、引言 在分布式系統(tǒng)中,多個節(jié)點可能同時讀寫同一共享資源。如果沒有實現(xiàn)互斥訪問和同步機制
    的頭像 發(fā)表于 12-04 11:24 ?700次閱讀

    分布式的三種實現(xiàn)方式

    分布式的三種實現(xiàn)方式? 分布式是在分布式系統(tǒng)中用于實現(xiàn)
    的頭像 發(fā)表于 12-28 10:01 ?896次閱讀
    主站蜘蛛池模板: 日本丝袜护士| 我要色色网| 无限资源在线观看完整版免费下载| 亚洲精品免费在线| caoporn 免费视频| 果冻传媒最新视频在线观看| 暖暖的视频完整视频免费韩国| 无码爽死成人777在线观看网站| 又爽又黄又粗又大免费视频| 成人 迅雷下载| 久久成人免费观看全部免费| 色狠狠xx| 中文字幕亚洲无线码在线| 国产AV高清怡春院| 伦理在线影院伦理电影| 小草视频免费观看在线| CHINA末成年VIDEO学生| 精品一区二区三区四区五区六区| 日本美女抠逼| 在线免费公开视频| 国产骚妇BB网| 全黄h全肉短篇禁乱np| 欲插爽乱浪伦骨| 国产精品嫩草影院在线观看免费 | 亚洲国产精品久久精品成人网站 | 国产高清视频免费最新在线| 伦理片在线3348| 亚洲免费三级电影| 国产成人免费| 欧美精品一区二区三区四区| 一本之道高清在线观看免费 | 国产电影午夜成年免费视频| 免费国产久久啪久久爱| 亚洲精品久久久久中文字幕二区| 扒开黑女人p大荫蒂老女人 | 永久免费在线视频| 国产精品A久久久久久久久| 欧美精品九九99久久在免费线| 伊人青青草| 国产亚洲精品久久久无码狼牙套| 日本一本二本三区免费免费高清|