最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合分布式鎖redisson的示例代碼

 更新時(shí)間:2023年02月23日 09:39:33   作者:梁山教父  
這篇文章主要介紹了SpringBoot整合分布式鎖redisson,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1、導(dǎo)入maven坐標(biāo)

<!-- 用redisson作為所有分布式鎖,分布式對(duì)象等功能框架-->
    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson</artifactId>
        <version>3.12.5</version>
    </dependency>

2、redisson配置類(如果redis沒有密碼就不需要private String password)

package com.xuechengpluscommon.config;
 
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * @description Redisson 配置類
 */
@Configuration
public class MyRedissonConfig {
 
    @Value(value = "${spring.redis.host}")
    private String host;
    @Value(value = "${spring.redis.port}")
    private int port;
    @Value(value = "${spring.redis.database}")
    private int database;
//    @Value(value = "${spring.redis.password}")
//    private String password;
 
    /**
     * 單Redis節(jié)點(diǎn)模式配置方法
     * 其他配置參數(shù),看:
     * <a >
     * 單Redis節(jié)點(diǎn)模式配置方法
     * </a>
     *
     * @return {@link RedissonClient}
     */
    @Bean(destroyMethod = "shutdown")
    RedissonClient redisson() {
        Config config = new Config();
        //Redis多節(jié)點(diǎn)
        // config.useClusterServers()
        //     .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001");
        //Redis單節(jié)點(diǎn)
        SingleServerConfig singleServerConfig = config.useSingleServer();
        //可以用"rediss://"來啟用SSL連接
        String address = "redis://" + host + ":" + port;
        singleServerConfig.setAddress(address);
        //設(shè)置 數(shù)據(jù)庫(kù)編號(hào)
        singleServerConfig.setDatabase(database);
//        singleServerConfig.setPassword(password);
        //連接池大小:默認(rèn)值:64
        // singleServerConfig.setConnectionPoolSize()
        return Redisson.create(config);
    }
 
}

yml中redis的配置

redis:
    database: 0
    host: ip地址
    port: 6379

3、創(chuàng)建redisson的bean

@Autowired
private RedissonClient redisson;

4、測(cè)試,入隊(duì)

@Test
void contextLoads1() {
    RQueue<String> queue = redisson.getQueue("RedissonQueue");
    queue.add("hello");
    System.out.println(queue);
}

redis數(shù)據(jù)

5、測(cè)試,出隊(duì)

@Test
void contextLoads2() {
    RQueue<String> queue = redisson.getQueue("RedissonQueue");
    String remove = queue.remove();
    System.out.println(remove);
}

出隊(duì)數(shù)據(jù):

6、分布式鎖

public R redisTest1() throws InterruptedException {
        //首先從redis查詢數(shù)據(jù)
        Orders redisOrder;
        redisOrder=(Orders) redisTemplate.opsForValue().get("redisTest");
        //如果存在redis則返回
        if(ObjectUtils.isNotEmpty(redisOrder)){
            return R.ok(redisOrder);
            //如果不存在則從數(shù)據(jù)庫(kù)查詢
        }else {
            //首先獲取分布式鎖
            RLock lock = redissonClient.getLock("redisTestDogWatch");
            //上鎖
            lock.lock();
 
            //獲取鎖之后進(jìn)行查詢
            try {
                redisOrder = (Orders) redisTemplate.opsForValue().get("redisTest");
                if (ObjectUtils.isNotEmpty(redisOrder)) {
                    return R.ok(redisOrder);
                }
                //數(shù)據(jù)庫(kù)查詢
                redisOrder= ordersService.getById(1577177773194113014L);
                redisTemplate.opsForValue().set("redisTest", redisOrder );
                System.out.println("[從數(shù)據(jù)庫(kù)中查詢]");
 
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //刪除鎖
                lock.unlock();
            }
            return R.ok(redisOrder);
        }
    }

在這里讓線程睡眠35秒

//上鎖
lock.lock();
Thread.sleep(35000);

此時(shí)三個(gè)服務(wù)器運(yùn)行

測(cè)試結(jié)果

可以首先看到已經(jīng)上鎖的redisTestDogWatch,每個(gè)鎖30秒,如果線程未完成則會(huì)自動(dòng)續(xù)30秒,如果線程完成到finally中的unlock就刪除鎖

目前可以看到只有一個(gè)服務(wù)器獲取到鎖

存儲(chǔ)redis的數(shù)據(jù)

此時(shí)進(jìn)行并發(fā)測(cè)試

依舊保持35秒的睡眠時(shí)間

此時(shí)可以看到未拿到鎖的線程報(bào)錯(cuò)

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: d904f2b9-e75d-472d-a5a6-d0a8cc603a80 thread-id: 210

嘗試解鎖鎖定,未被當(dāng)前線程鎖定 按節(jié)點(diǎn) ID:C731FAC4-9BF7-4F4A-ACC1-A2CC9B78A02F 線程 ID:232

這是因?yàn)殒i住了,所以無法獲取鎖,然后看門狗會(huì)不斷刷新

到此這篇關(guān)于SpringBoot整合分布式鎖redisson的文章就介紹到這了,更多相關(guān)SpringBoot整合分布式鎖redisson內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • logback?OutputStreamAppender高效日志輸出源碼解析

    logback?OutputStreamAppender高效日志輸出源碼解析

    這篇文章主要介紹了為大家logback?OutputStreamAppender日志輸出效率提升示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 在Jpa框架下拼接原生sql 并執(zhí)行的操作

    在Jpa框架下拼接原生sql 并執(zhí)行的操作

    這篇文章主要介紹了在Jpa框架下拼接原生sql 并執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 從搭建Struts2 開發(fā)環(huán)境說起

    從搭建Struts2 開發(fā)環(huán)境說起

    本篇文章,小編為大家介紹從搭建Struts2 開發(fā)環(huán)境說起,有需要的朋友可以參考一下
    2013-04-04
  • RocketMQ?Namesrv架構(gòu)工作原理詳解

    RocketMQ?Namesrv架構(gòu)工作原理詳解

    這篇文章主要為大家介紹了RocketMQ?Namesrv架構(gòu)工作原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • SPFA 算法實(shí)例講解

    SPFA 算法實(shí)例講解

    下面小編就為大家?guī)硪黄猄PFA 算法實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • MyBatis數(shù)組與集合判斷空問題

    MyBatis數(shù)組與集合判斷空問題

    這篇文章主要介紹了MyBatis數(shù)組與集合判斷空問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Spring Cloud基于zuul實(shí)現(xiàn)網(wǎng)關(guān)過程解析

    Spring Cloud基于zuul實(shí)現(xiàn)網(wǎng)關(guān)過程解析

    這篇文章主要介紹了Spring Cloud基于zuul實(shí)現(xiàn)網(wǎng)關(guān)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Spring Boot2解決idea console 控制臺(tái)輸出亂碼的問題

    Spring Boot2解決idea console 控制臺(tái)輸出亂碼的問題

    這篇文章主要介紹了Spring Boot2解決idea console 控制臺(tái)輸出亂碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 詳解Java包裝類及自動(dòng)裝箱拆箱

    詳解Java包裝類及自動(dòng)裝箱拆箱

    這篇文章主要介紹了Java包裝類及自動(dòng)裝箱拆箱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21解決辦法

    idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21解決辦法

    這篇文章主要給大家介紹了關(guān)于idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21的解決辦法,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

镇赉县| 苏尼特左旗| 多伦县| 绿春县| 安丘市| 临澧县| 喜德县| 平远县| 腾冲县| 咸宁市| 荣成市| 延吉市| 安吉县| 大安市| 新竹市| 龙陵县| 林州市| 交城县| 乐东| 六盘水市| 紫阳县| 中山市| 房产| 涟源市| 英德市| 孝感市| 屯昌县| 枝江市| 黄骅市| 浦北县| 平潭县| 雅江县| 柳河县| 龙山县| 新竹市| 光泽县| 凤冈县| 军事| 双鸭山市| 河东区| 通河县|