溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot怎么整合分布式鎖redisson

發(fā)布時(shí)間:2023-02-23 11:05:26 來源:億速云 閱讀:86 作者:iii 欄目:開發(fā)技術(shù)

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

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 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節(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ù)庫編號(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、測試,入隊(duì)

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

redis數(shù)據(jù)

SpringBoot怎么整合分布式鎖redisson

5、測試,出隊(duì)

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

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

SpringBoot怎么整合分布式鎖redisson

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ù)庫查詢
        }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ù)庫查詢
                redisOrder= ordersService.getById(1577177773194113014L);
                redisTemplate.opsForValue().set("redisTest", redisOrder );
                System.out.println("[從數(shù)據(jù)庫中查詢]");
 
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //刪除鎖
                lock.unlock();
            }
            return R.ok(redisOrder);
        }
    }

在這里讓線程睡眠35秒

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

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

SpringBoot怎么整合分布式鎖redisson

測試結(jié)果

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

SpringBoot怎么整合分布式鎖redisson

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

SpringBoot怎么整合分布式鎖redisson

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

SpringBoot怎么整合分布式鎖redisson

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

SpringBoot怎么整合分布式鎖redisson

依舊保持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ì)不斷刷新

SpringBoot怎么整合分布式鎖redisson

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI