Springboot2.X實(shí)現(xiàn)Redis分布式鎖

pom文件配置

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-integration</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.integration</groupId>
      <artifactId>spring-integration-redis</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  </dependencies>

application.yml配置:

server:
  port: 8081
spring:
  redis:
    jedis:
      pool:
        # 最大空閑連接數(shù)
        max-idle: 500
        # 最小空閑連接數(shù)
        min-idle: 50
        # 等待可用連接的最大時間讯蒲,負(fù)數(shù)為不限制
        max-wait:  -1s
        # 最大活躍連接數(shù),負(fù)數(shù)為不限制
        max-active: -1
    host: 192.168.67.129
    port: 6378
    timeout: 30s

RedisLockConfiguration配置類:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.integration.redis.util.RedisLockRegistry;


@Configuration
public class RedisLockConfiguration {
    @Bean
    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
        return new RedisLockRegistry(redisConnectionFactory, "redis-lock", 5000L);
    }
}

controller:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.redis.util.RedisLockRegistry;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.locks.Lock;

@RestController
@RequestMapping("/redis")
public class RedisLockController {

    Logger logger = LoggerFactory.getLogger(RedisLockController.class);
    private  int item = 50;//模擬只有50個庫存量

    private static final String  KEY = "item";



    @Autowired
    private RedisLockRegistry redisLockRegistry;

    @RequestMapping("/sale")
    public String sale() {

        while (item > 0) {
            Lock lock = redisLockRegistry.obtain(KEY);
            lock(lock);
            try {
                if (item > 0){
                   logger.info(Thread.currentThread().getName()+"搶到資源");
                    item--;
                    return Thread.currentThread().getName()+"搶到資源,剩余:"+item+"個";
                }

            }finally {
                lock.unlock();
            }
        }
        logger.info(Thread.currentThread().getName()+"搶不到資源");
        return Thread.currentThread().getName()+"搶不到資源";

    }



    @RequestMapping("/test")
    public  String test(){
        return "測試";
    }


    public void lock(Lock lock){
        //1.嘗試加鎖
        try {
            if(lock.tryLock()){
               return ;

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //2.加鎖失敗,當(dāng)前任務(wù)休眠一段時間

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        //3.遞歸調(diào)用,再次去搶鎖
        lock(lock);
    }
}

使用jmeter發(fā)送請求:

image.png
image.png
image.png

調(diào)用日志:

2020-04-09 12:16:27.948  INFO 13832 --- [io-8081-exec-25] c.sune.controller.RedisLockController  : http-nio-8081-exec-25搶到資源
2020-04-09 12:16:28.236  INFO 13832 --- [nio-8081-exec-5] c.sune.controller.RedisLockController  : http-nio-8081-exec-5搶到資源
2020-04-09 12:16:28.509  INFO 13832 --- [io-8081-exec-19] c.sune.controller.RedisLockController  : http-nio-8081-exec-19搶到資源
2020-04-09 12:16:28.802  INFO 13832 --- [io-8081-exec-11] c.sune.controller.RedisLockController  : http-nio-8081-exec-11搶到資源
2020-04-09 12:16:29.127  INFO 13832 --- [nio-8081-exec-6] c.sune.controller.RedisLockController  : http-nio-8081-exec-6搶到資源
2020-04-09 12:16:29.452  INFO 13832 --- [io-8081-exec-48] c.sune.controller.RedisLockController  : http-nio-8081-exec-48搶到資源
2020-04-09 12:16:29.754  INFO 13832 --- [io-8081-exec-14] c.sune.controller.RedisLockController  : http-nio-8081-exec-14搶到資源
2020-04-09 12:16:29.983  INFO 13832 --- [io-8081-exec-20] c.sune.controller.RedisLockController  : http-nio-8081-exec-20搶到資源
2020-04-09 12:16:30.234  INFO 13832 --- [io-8081-exec-21] c.sune.controller.RedisLockController  : http-nio-8081-exec-21搶到資源
2020-04-09 12:16:30.453  INFO 13832 --- [nio-8081-exec-3] c.sune.controller.RedisLockController  : http-nio-8081-exec-3搶到資源
2020-04-09 12:16:30.646  INFO 13832 --- [nio-8081-exec-7] c.sune.controller.RedisLockController  : http-nio-8081-exec-7搶到資源
2020-04-09 12:16:30.911  INFO 13832 --- [io-8081-exec-54] c.sune.controller.RedisLockController  : http-nio-8081-exec-54搶到資源
2020-04-09 12:16:31.126  INFO 13832 --- [io-8081-exec-41] c.sune.controller.RedisLockController  : http-nio-8081-exec-41搶到資源
2020-04-09 12:16:31.390  INFO 13832 --- [io-8081-exec-13] c.sune.controller.RedisLockController  : http-nio-8081-exec-13搶到資源
2020-04-09 12:16:31.561  INFO 13832 --- [io-8081-exec-46] c.sune.controller.RedisLockController  : http-nio-8081-exec-46搶到資源
2020-04-09 12:16:31.773  INFO 13832 --- [io-8081-exec-44] c.sune.controller.RedisLockController  : http-nio-8081-exec-44搶到資源
2020-04-09 12:16:31.957  INFO 13832 --- [io-8081-exec-43] c.sune.controller.RedisLockController  : http-nio-8081-exec-43搶到資源
2020-04-09 12:16:32.246  INFO 13832 --- [io-8081-exec-36] c.sune.controller.RedisLockController  : http-nio-8081-exec-36搶到資源
2020-04-09 12:16:32.424  INFO 13832 --- [io-8081-exec-15] c.sune.controller.RedisLockController  : http-nio-8081-exec-15搶到資源
2020-04-09 12:16:32.626  INFO 13832 --- [io-8081-exec-51] c.sune.controller.RedisLockController  : http-nio-8081-exec-51搶到資源
2020-04-09 12:16:32.833  INFO 13832 --- [io-8081-exec-37] c.sune.controller.RedisLockController  : http-nio-8081-exec-37搶到資源
2020-04-09 12:16:33.000  INFO 13832 --- [io-8081-exec-32] c.sune.controller.RedisLockController  : http-nio-8081-exec-32搶到資源
2020-04-09 12:16:33.189  INFO 13832 --- [io-8081-exec-35] c.sune.controller.RedisLockController  : http-nio-8081-exec-35搶到資源
2020-04-09 12:16:33.354  INFO 13832 --- [io-8081-exec-33] c.sune.controller.RedisLockController  : http-nio-8081-exec-33搶到資源
2020-04-09 12:16:33.519  INFO 13832 --- [io-8081-exec-53] c.sune.controller.RedisLockController  : http-nio-8081-exec-53搶到資源
2020-04-09 12:16:33.680  INFO 13832 --- [io-8081-exec-34] c.sune.controller.RedisLockController  : http-nio-8081-exec-34搶到資源
2020-04-09 12:16:33.847  INFO 13832 --- [io-8081-exec-26] c.sune.controller.RedisLockController  : http-nio-8081-exec-26搶到資源
2020-04-09 12:16:34.032  INFO 13832 --- [io-8081-exec-24] c.sune.controller.RedisLockController  : http-nio-8081-exec-24搶到資源
2020-04-09 12:16:34.216  INFO 13832 --- [io-8081-exec-30] c.sune.controller.RedisLockController  : http-nio-8081-exec-30搶到資源
2020-04-09 12:16:34.408  INFO 13832 --- [nio-8081-exec-8] c.sune.controller.RedisLockController  : http-nio-8081-exec-8搶到資源
2020-04-09 12:16:34.577  INFO 13832 --- [nio-8081-exec-2] c.sune.controller.RedisLockController  : http-nio-8081-exec-2搶到資源
2020-04-09 12:16:34.736  INFO 13832 --- [io-8081-exec-40] c.sune.controller.RedisLockController  : http-nio-8081-exec-40搶到資源
2020-04-09 12:16:34.906  INFO 13832 --- [io-8081-exec-42] c.sune.controller.RedisLockController  : http-nio-8081-exec-42搶到資源
2020-04-09 12:16:35.094  INFO 13832 --- [io-8081-exec-28] c.sune.controller.RedisLockController  : http-nio-8081-exec-28搶到資源
2020-04-09 12:16:35.260  INFO 13832 --- [io-8081-exec-52] c.sune.controller.RedisLockController  : http-nio-8081-exec-52搶到資源
2020-04-09 12:16:35.441  INFO 13832 --- [io-8081-exec-12] c.sune.controller.RedisLockController  : http-nio-8081-exec-12搶到資源
2020-04-09 12:16:35.609  INFO 13832 --- [io-8081-exec-22] c.sune.controller.RedisLockController  : http-nio-8081-exec-22搶到資源
2020-04-09 12:16:35.778  INFO 13832 --- [io-8081-exec-17] c.sune.controller.RedisLockController  : http-nio-8081-exec-17搶到資源
2020-04-09 12:16:35.949  INFO 13832 --- [io-8081-exec-45] c.sune.controller.RedisLockController  : http-nio-8081-exec-45搶到資源
2020-04-09 12:16:36.119  INFO 13832 --- [io-8081-exec-49] c.sune.controller.RedisLockController  : http-nio-8081-exec-49搶到資源
2020-04-09 12:16:36.284  INFO 13832 --- [io-8081-exec-29] c.sune.controller.RedisLockController  : http-nio-8081-exec-29搶到資源
2020-04-09 12:16:36.460  INFO 13832 --- [io-8081-exec-38] c.sune.controller.RedisLockController  : http-nio-8081-exec-38搶到資源
2020-04-09 12:16:36.621  INFO 13832 --- [nio-8081-exec-4] c.sune.controller.RedisLockController  : http-nio-8081-exec-4搶到資源
2020-04-09 12:16:36.788  INFO 13832 --- [nio-8081-exec-9] c.sune.controller.RedisLockController  : http-nio-8081-exec-9搶到資源
2020-04-09 12:16:36.965  INFO 13832 --- [nio-8081-exec-1] c.sune.controller.RedisLockController  : http-nio-8081-exec-1搶到資源
2020-04-09 12:16:37.141  INFO 13832 --- [io-8081-exec-16] c.sune.controller.RedisLockController  : http-nio-8081-exec-16搶到資源
2020-04-09 12:16:37.316  INFO 13832 --- [io-8081-exec-27] c.sune.controller.RedisLockController  : http-nio-8081-exec-27搶到資源
2020-04-09 12:16:37.485  INFO 13832 --- [io-8081-exec-39] c.sune.controller.RedisLockController  : http-nio-8081-exec-39搶到資源
2020-04-09 12:16:37.662  INFO 13832 --- [io-8081-exec-50] c.sune.controller.RedisLockController  : http-nio-8081-exec-50搶到資源
2020-04-09 12:16:37.829  INFO 13832 --- [io-8081-exec-31] c.sune.controller.RedisLockController  : http-nio-8081-exec-31搶到資源
2020-04-09 12:16:38.121  INFO 13832 --- [io-8081-exec-55] c.sune.controller.RedisLockController  : http-nio-8081-exec-55搶不到資源
2020-04-09 12:16:38.285  INFO 13832 --- [io-8081-exec-23] c.sune.controller.RedisLockController  : http-nio-8081-exec-23搶不到資源
2020-04-09 12:16:38.454  INFO 13832 --- [io-8081-exec-18] c.sune.controller.RedisLockController  : http-nio-8081-exec-18搶不到資源
2020-04-09 12:16:38.614  INFO 13832 --- [io-8081-exec-10] c.sune.controller.RedisLockController  : http-nio-8081-exec-10搶不到資源
2020-04-09 12:16:38.853  INFO 13832 --- [io-8081-exec-47] c.sune.controller.RedisLockController  : http-nio-8081-exec-47搶不到資源

有5個線程是搶不到資源,結(jié)果正確.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔓涧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贿条,更是在濱河造成了極大的恐慌粹懒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺像,死亡現(xiàn)場離奇詭異障贸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吟宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門篮洁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殃姓,你說我怎么就攤上這事袁波。” “怎么了蜗侈?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵篷牌,是天一觀的道長。 經(jīng)常有香客問我踏幻,道長枷颊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮夭苗,結(jié)果婚禮上信卡,老公的妹妹穿的比我還像新娘。我一直安慰自己听诸,他們只是感情好坐求,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晌梨,像睡著了一般桥嗤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仔蝌,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天泛领,我揣著相機(jī)與錄音,去河邊找鬼敛惊。 笑死渊鞋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞧挤。 我是一名探鬼主播锡宋,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼特恬!你這毒婦竟也來了执俩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤癌刽,失蹤者是張志新(化名)和其女友劉穎役首,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體显拜,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衡奥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了远荠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矮固。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖譬淳,靈堂內(nèi)的尸體忽然破棺而出档址,到底是詐尸還是另有隱情,我是刑警寧澤瘦赫,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布辰晕,位于F島的核電站,受9級特大地震影響确虱,放射性物質(zhì)發(fā)生泄漏含友。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘问。 院中可真熱鬧辆童,春花似錦、人聲如沸惠赫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儿咱。三九已至庭砍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間混埠,已是汗流浹背怠缸。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钳宪,地道東北人揭北。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像吏颖,于是被迫代替她去往敵國和親搔体。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容