springboot + redisson 簡單示例
阿新 • • 發佈:2021-11-01
參考: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(); } } }