springboot + redisson 簡單示例


參考:https://www.jianshu.com/p/118fceb2194a

 

項目應用場景,考慮到會短時間內插入大量的流水數據進庫數據,所以先保存在redis中,然后執行定時器5分鍾獲取redis的當前數據,進行批量插入。可能需求上 的統計的時間比5分鍾還短,不確定上一次是否執行完畢,所以加個鎖。

 

springBoot 參考版本: 2.3.7.RELEASE

        
        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.13.6</version>
        </dependency>            

 config:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class MyRedissonConfig {

    @Autowired
    private RedisProperties redisProperties;

    @Bean(destroyMethod="shutdown")
    RedissonClient redissonClient() throws IOException {
        //1、創建配置
        Config config = new Config();
        config.useSingleServer()
                .setAddress("redis://"+redisProperties.getHost()+":"+redisProperties.getPort());//要早yml配置文件中配置好 spring:redis return Redisson.create(config);
    }

}

  Test文件 : 在執行run1 方法的時候,再執行run2方法,就會發現 run2方法一直停留在獲取鎖的狀態下,直到run1方法釋放鎖,run2方法才會接着執行

import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Log4j2
@SpringBootTest
public class MyLockTest {

    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private final static String REDIS_KEY = "test_lock_list";

    @Test
    public void addRedisData(){
        for (int i = 0; i < 100; i++) {
            stringRedisTemplate.opsForList().rightPush(REDIS_KEY,i+"");
        }
    }

    @Test
    public void runTest1(){
        System.out.println("_____________________________執行run1");
        testLock();
    }

    @Test
    public void runTest2(){
        System.out.println("_____________________________執行run2");
        testLock();
    }

    public void testLock(){
        if(redissonClient==null){
            System.out.println("redissonClient 空");
            return;
        }
        RLock testLock = redissonClient.getLock("testLock");
        testLock.lock(60, TimeUnit.SECONDS);
        System.out.println("正在獲取鎖:"+System.currentTimeMillis());
        testLock.lock();
        System.out.println("獲取鎖成功:"+System.currentTimeMillis());
        try{
            List<String> list = stringRedisTemplate.opsForList().range(REDIS_KEY,0,50);
            /**
             * 進行一堆邏輯 , 假設這些邏輯的處理時間非常耗時,需要20S
             */
            Thread.sleep(20000);
            list.forEach(t->{
                System.out.println(t);
            });
            stringRedisTemplate.opsForList().trim(REDIS_KEY,list.size(),-1);
        }catch (Exception e){

        }finally {
            System.out.println("釋放鎖");
            testLock.unlock();
        }
    }


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM