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

基于Redis分布式鎖Redisson及SpringBoot集成Redisson

 更新時(shí)間:2022年09月23日 10:06:00   作者:_燈火闌珊處  
這篇文章主要介紹了基于Redis分布式鎖Redisson及SpringBoot集成Redisson,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小小伙伴可以參考一下

- 分布式鎖需要具備的條件和剛需

  • 獨(dú)占性:OnlyOne,任何時(shí)刻只能有且僅有一個(gè)線程持有
  • 高可用:若redis集群環(huán)境下,不能因?yàn)槟骋粋€(gè)節(jié)點(diǎn)掛了而出現(xiàn)獲取鎖和釋放鎖失敗的情況
  • 防死鎖:杜絕死鎖,必須有超時(shí)控制機(jī)制或者撤銷操作,有個(gè)兜底終止跳出方案
  • 不亂搶:防止張冠李戴,不能私下unlock別人的鎖,只能自己加鎖自己釋放
  • 重入性:同一個(gè)節(jié)點(diǎn)的同一個(gè)線程如果獲得鎖之后,它也可以再次獲取這個(gè)鎖

- Redisson使用

引入 redisson 依賴:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.16.2</version>
</dependency>

添加 redisson 配置:

import org.redisson.Redisson;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.io.Serializable;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        // 設(shè)置key序列號(hào)方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 設(shè)置value的序列化方式j(luò)son
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    @Bean
    public Redisson redisson() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://192.168.10.233:6379").setDatabase(0);
        return (Redisson) Redisson.create(config);
    }

}

接口測(cè)試:

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private Redisson redisson;

    private static final String KEY = "spike";

    @GetMapping("/buy")
    public String bugGood() {
        RLock redissonLock = redisson.getLock(KEY);
        redissonLock.lock();
        try {
            String result = stringRedisTemplate.opsForValue().get("goods:001");
            int goodNumber = result == null ? 0 : Integer.parseInt(result);
            if (goodNumber > 0) {
                int realNum = goodNumber - 1;
                stringRedisTemplate.opsForValue().set("goods:001", realNum + "");
                return "秒殺成功,剩余庫(kù)存:" + realNum;
            }
            return "商品已售罄!";
        } finally {
            redissonLock.unlock();
        }
    }

}

多節(jié)點(diǎn)的情況下,代碼相同,要保證 lock 的 key 一樣

- SpringBoot集成Redisson

引入 redis 和 redisson starter:

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
</dependency>

redis 配置:

spring:
  redis:
    # 地址
    host: 192.168.20.26
    # 端口,默認(rèn)為6379
    port: 6379
    password: 123456
    # 連接超時(shí)時(shí)間
    timeout: 30s
    database: 0
    lettuce:
      pool:
        # 連接池中的最小空閑連接
        min-idle: 0
        # 連接池中的最大空閑連接
        max-idle: 8
        # 連接池的最大數(shù)據(jù)庫(kù)連接數(shù)
        max-active: 8
        # #連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制)
        max-wait: -1ms

redisson配置:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.redisson.config.TransportMode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * redisson配置
 */
@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private String port;
    @Value("${spring.redis.password}")
    private String password;

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.setTransportMode(TransportMode.NIO);
        // 單體配置,如果是SSL連接,使用 rediss://
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setAddress("redis://" + host + ":" + port);
        singleServerConfig.setPassword(password);
        return Redisson.create(config);
    }
}

使用:

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
public class TestController {

    @Resource
    private RedissonClient redissonClient;

    public void doAction1() {
        String lockKey = "lockKey";
        RLock lock = redissonClient.getLock(lockKey);
        // 加鎖,無(wú)參數(shù)
        lock.lock();
        // 鎖有效時(shí)間,時(shí)間單位
        // lock.lock(5, TimeUnit.SECONDS);
        try {
            // do something
        } finally {
            // 解鎖
            lock.unlock();
        }
    }
    public void doAction2() throws InterruptedException {
        String lockKey = "lockKey";
        RLock lock = redissonClient.getLock(lockKey);
        // 1. 無(wú)參數(shù),直接上鎖
        // lock.tryLock();
        // 2. 等待時(shí)間,時(shí)間單位
        // lock.tryLock(3, TimeUnit.SECONDS);
        // 3. 等待時(shí)間,鎖有效時(shí)間,時(shí)間單位
        // lock.tryLock(3, 5, TimeUnit.SECONDS);
        try {
            // 常規(guī)寫(xiě)法
            if (lock.tryLock(3, 5, TimeUnit.SECONDS)) {
                // do something
            } else {
                // 沒(méi)有獲取到鎖
            }
        } finally {
            // 解鎖
            lock.unlock();
        }
    }

}

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

相關(guān)文章

  • 使用Java實(shí)現(xiàn)簽字功能的示例代碼

    使用Java實(shí)現(xiàn)簽字功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)簽字功能,同時(shí)支持將簽字圖像保存為PNG格式和將簽字添加到PDF文檔中,感興趣的可以了解下
    2024-02-02
  • java二叉查找樹(shù)的實(shí)現(xiàn)代碼

    java二叉查找樹(shù)的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java二叉查找樹(shù)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java實(shí)現(xiàn)推箱子游戲

    Java實(shí)現(xiàn)推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 深入探究一下Java中不同的線程間數(shù)據(jù)通信方式

    深入探究一下Java中不同的線程間數(shù)據(jù)通信方式

    這篇文章主要來(lái)和大家一起深入探究一下Java中不同的線程間數(shù)據(jù)通信方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-04-04
  • SpringBoot中JSON數(shù)值溢出問(wèn)題的處理方案

    SpringBoot中JSON數(shù)值溢出問(wèn)題的處理方案

    SpringBoot接口因JSON數(shù)值超出int范圍報(bào)錯(cuò),解決方案為:將字段改為L(zhǎng)ong、全局異常處理返回友好提示、添加數(shù)據(jù)校驗(yàn),推薦使用Long存儲(chǔ)大數(shù)值,避免溢出,本文通過(guò)代碼講解的非常詳細(xì),需要的朋友可以參考下
    2025-08-08
  • Intellij idea熱部署插件JRebel的使用

    Intellij idea熱部署插件JRebel的使用

    這篇文章主要介紹了Intellij idea熱部署插件JRebel的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java?Spring?事件監(jiān)聽(tīng)詳情解析

    Java?Spring?事件監(jiān)聽(tīng)詳情解析

    這篇文章主要介紹了Java?Spring?事件監(jiān)聽(tīng)詳情解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 關(guān)于RabbitMQ的Channel默認(rèn)線程

    關(guān)于RabbitMQ的Channel默認(rèn)線程

    這篇文章主要介紹了關(guān)于RabbitMQ的Channel默認(rèn)線程,通過(guò)jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費(fèi)者這邊就會(huì)創(chuàng)建一條線程,言下之意,一個(gè)channel當(dāng)消息來(lái)到時(shí)就會(huì)異步處理這些消息,需要的朋友可以參考下
    2023-09-09
  • Java使用System.currentTimeMillis()方法計(jì)算程序運(yùn)行時(shí)間的示例代碼

    Java使用System.currentTimeMillis()方法計(jì)算程序運(yùn)行時(shí)間的示例代碼

    System.currentTimeMillis() 方法的返回類型為 long ,表示毫秒為單位的當(dāng)前時(shí)間,文中通過(guò)示例代碼介紹了計(jì)算 String 類型與 StringBuilder 類型拼接字符串的耗時(shí)情況,對(duì)Java計(jì)算程序運(yùn)行時(shí)間相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-03-03
  • Java JDK安裝、環(huán)境配置圖文教程

    Java JDK安裝、環(huán)境配置圖文教程

    JDK 是Java程序開(kāi)發(fā)的核心工具包,包含了開(kāi)發(fā)Java應(yīng)用程序所需的所有資源,本文給大家介紹Java JDK安裝、環(huán)境配置圖文教程,感興趣的朋友跟隨小編一起看看吧
    2025-10-10

最新評(píng)論

云南省| 晋中市| 江孜县| 新昌县| 临高县| 江孜县| 合川市| 清流县| 田东县| 普洱| 兴仁县| 合肥市| 成武县| 胶南市| 博乐市| 潜山县| 固始县| 河间市| 忻州市| 江油市| 海阳市| 焉耆| 兴化市| 扶绥县| 朝阳县| 铜陵市| 安吉县| 南靖县| 罗源县| 镇巴县| 淅川县| 怀集县| 鄂伦春自治旗| 定陶县| 阿瓦提县| 武冈市| 晋州市| 隆化县| 南川市| 怀集县| 黑水县|