国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring boot 實(shí)現(xiàn)Redisson分布式鎖及其讀寫鎖

這篇具有很好參考價(jià)值的文章主要介紹了spring boot 實(shí)現(xiàn)Redisson分布式鎖及其讀寫鎖。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

分布式鎖,就是控制分布式系統(tǒng)中不同進(jìn)程共同訪問同一共享資源的一種鎖的實(shí)現(xiàn)。
1、引入依賴

<dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.15.5</version>
        </dependency>

2、配置文件

spring:
	data:
		redis:
	      database: 1
	      host: localhost
	      port: 6379
	      password: *********

3、配置類

package com.example.springboot3test.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;

/**
 * @author DeyouKong
 * @description TODO
 * @date 2023/3/23 23:34
 */

@Configuration
public class RedissonConfig {
    @Value(value = "${spring.data.redis.host}")
    private String host;
    @Value(value = "${spring.data.redis.port}")
    private int port;
    @Value(value = "${spring.data.redis.database}")
    private int database;
    @Value(value = "${spring.data.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);
    }


}

4、測(cè)試代碼

package com.example.springboot3test.controller;

import jakarta.annotation.Resource;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/redission")
public class RedissionController {
    @Resource
    private RedissonClient redissonClient;

    private final static String LOCK="I_AM_LOCK";

    @GetMapping("/list")
    public String getString(){
        // 1、獲取一把鎖,只要鎖的名字一樣,既是同一把鎖
        RLock lock = redissonClient.getLock(LOCK);
        // 2、加鎖
        //lock.lock(5, TimeUnit.SECONDS); // 阻塞式等待

        if(lock.isLocked()){
            //如果存在鎖,則返回失敗
            return "fail";
        }

        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+":\t 獲得鎖");
            Thread.sleep(20000);
        } catch (Exception e) {
            e.printStackTrace();
            return "占用所";
        }finally {
            // 3、解鎖
            lock.unlock();
            System.out.println(Thread.currentThread().getName()+":\t 釋放鎖鎖");
        }
        return "OK";
    }
}

5、理解
一、時(shí)間設(shè)置
默認(rèn) lock() 小結(jié)
lock.lock ();
(1)默認(rèn)指定鎖時(shí)間為30s(看門狗時(shí)間)
(2)鎖的自動(dòng)續(xù)期:若是業(yè)務(wù)超長(zhǎng),運(yùn)行期間自動(dòng)給鎖上新的 30s,不用擔(dān)心業(yè)務(wù)時(shí)間過長(zhǎng),鎖就自動(dòng)過期
(3)加鎖的業(yè)務(wù)只要運(yùn)行完成,就不會(huì)給當(dāng)前鎖續(xù)期,及時(shí)不手動(dòng)解鎖,鎖默認(rèn)在30s 后自動(dòng)刪除。
指定時(shí)間 lock() 小結(jié)
問題:在鎖到期的時(shí)候,不會(huì)自動(dòng)續(xù)期。
(1)如果我們傳遞了鎖的超時(shí)時(shí)間,就發(fā)送給 redis執(zhí)行腳本,進(jìn)行占鎖,默認(rèn)的超時(shí)時(shí)間既我們指的時(shí)間
(2)若是未指定鎖的超時(shí)時(shí)間,就使用 30*1000【LockWatchdogTimeout看門狗的默認(rèn)時(shí)間】
(3)只要占鎖成功,就會(huì)啟動(dòng)一個(gè)定時(shí)任務(wù)【重新給鎖設(shè)置過期時(shí)間,新的過期時(shí)間就是看門狗的默認(rèn)時(shí)間】,每隔 10 s都會(huì)自動(dòng)再次續(xù)到30s, internallockLeaseTime【看門狗時(shí)間/3s】
二、其他
1、互斥
在分布式高并發(fā)的條件下,我們最需要保證,同一時(shí)刻只能有一個(gè)線程獲得鎖,這是最基本的一點(diǎn)。

2、防止死鎖
在分布式高并發(fā)的條件下,比如有個(gè)線程獲得鎖的同時(shí),還沒有來得及去釋放鎖,就因?yàn)橄到y(tǒng)故障或者其它原因使它無法執(zhí)行釋放鎖的命令,導(dǎo)致其它線程都無法獲得鎖,造成死鎖。所以分布式非常有必要設(shè)置鎖的有效時(shí)間,確保系統(tǒng)出現(xiàn)故障后,在一定時(shí)間內(nèi)能夠主動(dòng)去釋放鎖,避免造成死鎖的情況。
6、讀寫鎖
讀寫鎖(Readers-Writer Lock)顧名思義是一把鎖分為兩部分:讀鎖和寫鎖,其中讀鎖允許多個(gè)線程同時(shí)獲得,因?yàn)樽x操作本身是線程安全的,而寫鎖則是互斥鎖,不允許多個(gè)線程同時(shí)獲得寫鎖,并且寫操作和讀操作也是互斥的??偨Y(jié)來說,讀寫鎖的特點(diǎn)是:讀讀不互斥、讀寫互斥、寫寫互斥。
實(shí)現(xiàn):首先要配置redis,見前面的博客

spring boot配置redis
讀寫鎖代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-654978.html

package com.example.springboot3test.controller;

import jakarta.annotation.Resource;
import org.redisson.api.RLock;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/redission")
public class RedissionController {
    @Resource
    private RedissonClient redissonClient;

    @Resource
    private RedisTemplate redisTemplate;

    private final static String LOCK="I_AM_LOCK";

    // 并發(fā)寫鎖
    @GetMapping("/write")
    public String writeValue(){
        RReadWriteLock myLock = redissonClient.getReadWriteLock ("my_lock");
        RLock rLock = myLock.writeLock ( );
        rLock.lock ();
        String s = "";
        try {
            System.out.println ("寫鎖加鎖成功..."+Thread.currentThread ().getId () );
            s= UUID.randomUUID ().toString ();
            Thread.sleep(20000);
            redisTemplate.opsForValue ().set ("writeValue",s);
        } catch (Exception e) {
            e.printStackTrace ();
        }
        finally {
            System.out.println ("寫鎖解鎖成功..."+Thread.currentThread ().getId () );
            rLock.unlock ();
        }
        return s;
    }

    // 并發(fā)讀鎖
    @GetMapping("read")
    public String readValue(){
        RReadWriteLock myLock = redissonClient.getReadWriteLock ("my_lock");
        RLock rLock = myLock.readLock ( );
        rLock.lock ();
        String s = "";
        try {
            System.out.println ("讀鎖加鎖成功..."+Thread.currentThread ().getId ());
            Thread.sleep(20000);
            s = (String) redisTemplate.opsForValue ().get ("writeValue");
        } catch (Exception e) {
            e.printStackTrace ( );
        }finally {
            System.out.println ("讀鎖解鎖成功..."+Thread.currentThread ().getId () );
            rLock.unlock ();
        }
        return s;
    }
}

到了這里,關(guān)于spring boot 實(shí)現(xiàn)Redisson分布式鎖及其讀寫鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Boot如何實(shí)現(xiàn)分布式消息隊(duì)列

    Spring Boot如何實(shí)現(xiàn)分布式消息隊(duì)列

    在分布式系統(tǒng)中,消息隊(duì)列是非常重要的一部分,可以幫助開發(fā)人員實(shí)現(xiàn)異步處理、解耦系統(tǒng)、提高系統(tǒng)可靠性等。本文將介紹如何使用 Spring Boot 實(shí)現(xiàn)分布式消息隊(duì)列。 消息隊(duì)列是一種存儲(chǔ)消息的容器,可以緩存消息并在需要的時(shí)候按照一定的規(guī)則將消息發(fā)送給消費(fèi)者。常

    2024年02月14日
    瀏覽(22)
  • Spring Boot實(shí)現(xiàn)分布式事務(wù)的協(xié)調(diào)和管理

    在現(xiàn)代的分布式系統(tǒng)中,往往存在多個(gè)服務(wù)協(xié)同完成一個(gè)業(yè)務(wù)操作的情況。而在這種情況下,如何保證所有服務(wù)的數(shù)據(jù)一致性成為了一個(gè)重要的問題。Spring Boot作為一個(gè)流行的Java開發(fā)框架,提供了多種方法來實(shí)現(xiàn)分布式事務(wù)的協(xié)調(diào)和管理。本文將介紹一些常用的方式和技術(shù)來

    2024年02月08日
    瀏覽(24)
  • Redisson實(shí)現(xiàn)分布式鎖示例

    Redisson實(shí)現(xiàn)分布式鎖示例

    可以下載redis desktop manager軟件來查看redis里面存放的東西 紅色框內(nèi)的TTL值就是過期時(shí)間,默認(rèn)-1,表示永不過期,指定過期時(shí)間后就變成你指定的值了。 上面的方法,我們讓線程睡眠60S,代表我們的業(yè)務(wù)執(zhí)行時(shí)間,在調(diào)用這個(gè)方法時(shí),我們可以在 redis desktop manager軟件上實(shí)時(shí)查

    2024年02月12日
    瀏覽(22)
  • # Spring Boot 中如何使用 Spring Cloud Sleuth 來實(shí)現(xiàn)分布式跟蹤?

    # Spring Boot 中如何使用 Spring Cloud Sleuth 來實(shí)現(xiàn)分布式跟蹤?

    在微服務(wù)架構(gòu)中,通常會(huì)有多個(gè)服務(wù)相互協(xié)作,為了方便排查問題,我們需要對(duì)服務(wù)之間的調(diào)用進(jìn)行跟蹤。Spring Cloud Sleuth 是 Spring Cloud 生態(tài)中的分布式跟蹤解決方案,它可以幫助我們追蹤請(qǐng)求在微服務(wù)系統(tǒng)中的傳遞路徑,以及記錄每個(gè)服務(wù)的處理時(shí)間等信息。 本文將介紹如

    2024年02月08日
    瀏覽(42)
  • SpringBoot結(jié)合Redisson實(shí)現(xiàn)分布式鎖

    SpringBoot結(jié)合Redisson實(shí)現(xiàn)分布式鎖

    ?????作者名稱:DaenCode ??作者簡(jiǎn)介:啥技術(shù)都喜歡搗鼓搗鼓,喜歡分享技術(shù)、經(jīng)驗(yàn)、生活。 ??人生感悟:嘗盡人生百味,方知世間冷暖。 ??所屬專欄:SpringBoot實(shí)戰(zhàn) 以下是專欄部分內(nèi)容,更多內(nèi)容請(qǐng)前往專欄查看! 標(biāo)題 一文帶你學(xué)會(huì)使用SpringBoot+Avue實(shí)現(xiàn)短信通知功能

    2024年02月08日
    瀏覽(26)
  • Spring Boot如何實(shí)現(xiàn)分布式系統(tǒng)中的服務(wù)發(fā)現(xiàn)和注冊(cè)?

    Spring Boot如何實(shí)現(xiàn)分布式系統(tǒng)中的服務(wù)發(fā)現(xiàn)和注冊(cè)?

    隨著互聯(lián)網(wǎng)的快速發(fā)展,越來越多的企業(yè)開始將自己的業(yè)務(wù)遷移到分布式系統(tǒng)中。在這種情況下,服務(wù)發(fā)現(xiàn)和注冊(cè)變得尤為重要。對(duì)于分布式系統(tǒng)中的每個(gè)服務(wù)來說,它需要知道其他服務(wù)的位置和狀態(tài),這樣才能進(jìn)行通信和協(xié)作。Spring Boot提供了一些工具和框架,可以幫助我

    2024年02月07日
    瀏覽(22)
  • 圖解Redisson如何實(shí)現(xiàn)分布式鎖、鎖續(xù)約?

    圖解Redisson如何實(shí)現(xiàn)分布式鎖、鎖續(xù)約?

    使用當(dāng)前(2022年12月初)最新的版本:3.18.1; 案例 案例采用redis-cluster集群的方式; redission支持4種連接redis方式,分別為單機(jī)、主從、Sentinel、Cluster 集群;在分布式鎖的實(shí)現(xiàn)上區(qū)別在于hash槽的獲取方式。 具體配置方式見Redisson的GitHub(https://github.com/redisson/redisson/wiki/2.-%E9

    2023年04月16日
    瀏覽(31)
  • Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合

    Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合

    本文參考黑馬 分布式Elastic search Elasticsearch是一款非常強(qiáng)大的開源搜索引擎,具備非常多強(qiáng)大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容 本篇文章將講解 Elastic Search 如何實(shí)現(xiàn)數(shù)據(jù)聚合,以及 在項(xiàng)目實(shí)戰(zhàn)中如何通過數(shù)據(jù)聚合實(shí)現(xiàn)業(yè)務(wù)需求并完成功能。 以下為官方

    2024年02月11日
    瀏覽(33)
  • Redis分布式鎖及Redisson的實(shí)現(xiàn)原理

    Redis分布式鎖及Redisson的實(shí)現(xiàn)原理

    Redis分布式鎖 在討論分布式鎖之前我們回顧一下一些單機(jī)鎖,比如synchronized、Lock 等 鎖的基本特性: 1.互斥性:同一時(shí)刻只能有一個(gè)節(jié)點(diǎn)訪問共享資源,比如一個(gè)代碼塊,或者同一個(gè)訂單同一時(shí)刻只能有一個(gè)線程去支付等。 2.可重入性: 允許一個(gè)已經(jīng)獲得鎖的線程,在沒有釋

    2024年02月06日
    瀏覽(23)
  • 源碼篇--Redisson 分布式鎖lock的實(shí)現(xiàn)

    我們知道Redis 緩存可以使用setNx來作為分布式鎖,但是我們直接使用setNx 需要考慮鎖過期的問題;此時(shí)我們可以使用Redisson 的lock 來實(shí)現(xiàn)分布式鎖,那么lock 內(nèi)部幫我們做了哪些工作呢。 RedisConfig.java lock.lock() 阻塞獲取 redis 鎖,獲取到鎖之后繼續(xù)向下執(zhí)行業(yè)務(wù)邏輯; lockInterr

    2024年01月25日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包