91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot怎么整合分布式鎖redisson

發布時間:2023-02-23 11:05:26 來源:億速云 閱讀:97 作者:iii 欄目:開發技術

這篇文章主要介紹“SpringBoot怎么整合分布式鎖redisson”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringBoot怎么整合分布式鎖redisson”文章能幫助大家解決問題。

1、導入maven坐標

<!-- 用redisson作為所有分布式鎖,分布式對象等功能框架-->
    <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節點模式配置方法
     * 其他配置參數,看:
     * <a href = "https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95#26-%E5%8D%95redis%E8%8A%82%E7%82%B9%E6%A8%A1%E5%BC%8F">
     * 單Redis節點模式配置方法
     * </a>
     *
     * @return {@link RedissonClient}
     */
    @Bean(destroyMethod = "shutdown")
    RedissonClient redisson() {
        Config config = new Config();
        //Redis多節點
        // config.useClusterServers()
        //     .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001");
        //Redis單節點
        SingleServerConfig singleServerConfig = config.useSingleServer();
        //可以用"rediss://"來啟用SSL連接
        String address = "redis://" + host + ":" + port;
        singleServerConfig.setAddress(address);
        //設置 數據庫編號
        singleServerConfig.setDatabase(database);
//        singleServerConfig.setPassword(password);
        //連接池大小:默認值:64
        // singleServerConfig.setConnectionPoolSize()
        return Redisson.create(config);
    }
 
}

yml中redis的配置

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

3、創建redisson的bean

@Autowired
private RedissonClient redisson;

4、測試,入隊

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

redis數據

SpringBoot怎么整合分布式鎖redisson

5、測試,出隊

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

出隊數據:

SpringBoot怎么整合分布式鎖redisson

6、分布式鎖

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

在這里讓線程睡眠35秒

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

此時三個服務器運行

SpringBoot怎么整合分布式鎖redisson

測試結果

可以首先看到已經上鎖的redisTestDogWatch,每個鎖30秒,如果線程未完成則會自動續30秒,如果線程完成到finally中的unlock就刪除鎖

SpringBoot怎么整合分布式鎖redisson

目前可以看到只有一個服務器獲取到鎖

SpringBoot怎么整合分布式鎖redisson

存儲redis的數據

SpringBoot怎么整合分布式鎖redisson

此時進行并發測試

SpringBoot怎么整合分布式鎖redisson

依舊保持35秒的睡眠時間

此時可以看到未拿到鎖的線程報錯

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

嘗試解鎖鎖定,未被當前線程鎖定 按節點 ID:C731FAC4-9BF7-4F4A-ACC1-A2CC9B78A02F 線程 ID:232

這是因為鎖住了,所以無法獲取鎖,然后看門狗會不斷刷新

SpringBoot怎么整合分布式鎖redisson

關于“SpringBoot怎么整合分布式鎖redisson”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定兴县| 东阳市| 竹山县| 温宿县| 宁波市| 醴陵市| 惠来县| 西乡县| 宁陕县| 隆德县| 中西区| 澄江县| 开原市| 专栏| 儋州市| 彭泽县| 邯郸市| 连州市| 屯留县| 当雄县| 阿勒泰市| 阳朔县| 景泰县| 长泰县| 沅江市| 冷水江市| 五峰| 乌什县| 铜梁县| 安岳县| 华蓥市| 南康市| 宝丰县| 葫芦岛市| 怀仁县| 临夏市| 腾冲县| 武汉市| 鄂伦春自治旗| 宁河县| 从江县|