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

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

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

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

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

- 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);
        // 設置key序列號方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 設置value的序列化方式json
        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);
    }

}

接口測試:

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 "秒殺成功,剩余庫存:" + realNum;
            }
            return "商品已售罄!";
        } finally {
            redissonLock.unlock();
        }
    }

}

多節(jié)點的情況下,代碼相同,要保證 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
    # 端口,默認為6379
    port: 6379
    password: 123456
    # 連接超時時間
    timeout: 30s
    database: 0
    lettuce:
      pool:
        # 連接池中的最小空閑連接
        min-idle: 0
        # 連接池中的最大空閑連接
        max-idle: 8
        # 連接池的最大數(shù)據(jù)庫連接數(shù)
        max-active: 8
        # #連接池最大阻塞等待時間(使用負值表示沒有限制)
        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);
        // 加鎖,無參數(shù)
        lock.lock();
        // 鎖有效時間,時間單位
        // 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. 無參數(shù),直接上鎖
        // lock.tryLock();
        // 2. 等待時間,時間單位
        // lock.tryLock(3, TimeUnit.SECONDS);
        // 3. 等待時間,鎖有效時間,時間單位
        // lock.tryLock(3, 5, TimeUnit.SECONDS);
        try {
            // 常規(guī)寫法
            if (lock.tryLock(3, 5, TimeUnit.SECONDS)) {
                // do something
            } else {
                // 沒有獲取到鎖
            }
        } finally {
            // 解鎖
            lock.unlock();
        }
    }

}

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

相關文章

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

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

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

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

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

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

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

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

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

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

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

    Intellij idea熱部署插件JRebel的使用

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

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

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

    關于RabbitMQ的Channel默認線程

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

    Java使用System.currentTimeMillis()方法計算程序運行時間的示例代碼

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

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

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

最新評論

宁国市| 乾安县| 东安县| 凤庆县| 孝感市| 同仁县| 木里| 阳曲县| 昆明市| 伊金霍洛旗| 沾化县| 东乡族自治县| 本溪市| 始兴县| 兴海县| 玛纳斯县| 合作市| 伊通| 华坪县| 元朗区| 古交市| 凉城县| 双鸭山市| 庆云县| 确山县| 沁阳市| 保康县| 边坝县| 黄石市| 七台河市| 突泉县| 稻城县| 于都县| 赞皇县| 保山市| 洛阳市| 东平县| 通州区| 桂东县| 满城县| 台前县|