1. 程式人生 > 其它 >springboot + redisson 簡單示例

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();
        }
    }


}