您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringBoot怎么整合分布式鎖redisson”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringBoot怎么整合分布式鎖redisson”文章能幫助大家解決問題。
<!-- 用redisson作為所有分布式鎖,分布式對象等功能框架--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.12.5</version> </dependency>
package com.xuechengpluscommon.config; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.redisson.config.SingleServerConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @description Redisson 配置類 */ @Configuration public class MyRedissonConfig { @Value(value = "${spring.redis.host}") private String host; @Value(value = "${spring.redis.port}") private int port; @Value(value = "${spring.redis.database}") private int database; // @Value(value = "${spring.redis.password}") // private String password; /** * 單Redis節點模式配置方法 * 其他配置參數,看: * <a href = "https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95#26-%E5%8D%95redis%E8%8A%82%E7%82%B9%E6%A8%A1%E5%BC%8F"> * 單Redis節點模式配置方法 * </a> * * @return {@link RedissonClient} */ @Bean(destroyMethod = "shutdown") RedissonClient redisson() { Config config = new Config(); //Redis多節點 // config.useClusterServers() // .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001"); //Redis單節點 SingleServerConfig singleServerConfig = config.useSingleServer(); //可以用"rediss://"來啟用SSL連接 String address = "redis://" + host + ":" + port; singleServerConfig.setAddress(address); //設置 數據庫編號 singleServerConfig.setDatabase(database); // singleServerConfig.setPassword(password); //連接池大小:默認值:64 // singleServerConfig.setConnectionPoolSize() return Redisson.create(config); } }
yml中redis的配置
redis: database: 0 host: ip地址 port: 6379
@Autowired private RedissonClient redisson;
@Test void contextLoads1() { RQueue<String> queue = redisson.getQueue("RedissonQueue"); queue.add("hello"); System.out.println(queue); }
redis數據
@Test void contextLoads2() { RQueue<String> queue = redisson.getQueue("RedissonQueue"); String remove = queue.remove(); System.out.println(remove); }
出隊數據:
public R redisTest1() throws InterruptedException { //首先從redis查詢數據 Orders redisOrder; redisOrder=(Orders) redisTemplate.opsForValue().get("redisTest"); //如果存在redis則返回 if(ObjectUtils.isNotEmpty(redisOrder)){ return R.ok(redisOrder); //如果不存在則從數據庫查詢 }else { //首先獲取分布式鎖 RLock lock = redissonClient.getLock("redisTestDogWatch"); //上鎖 lock.lock(); //獲取鎖之后進行查詢 try { redisOrder = (Orders) redisTemplate.opsForValue().get("redisTest"); if (ObjectUtils.isNotEmpty(redisOrder)) { return R.ok(redisOrder); } //數據庫查詢 redisOrder= ordersService.getById(1577177773194113014L); redisTemplate.opsForValue().set("redisTest", redisOrder ); System.out.println("[從數據庫中查詢]"); } catch (Exception e) { e.printStackTrace(); } finally { //刪除鎖 lock.unlock(); } return R.ok(redisOrder); } }
在這里讓線程睡眠35秒
//上鎖 lock.lock(); Thread.sleep(35000);
此時三個服務器運行
測試結果
可以首先看到已經上鎖的redisTestDogWatch,每個鎖30秒,如果線程未完成則會自動續30秒,如果線程完成到finally中的unlock就刪除鎖
目前可以看到只有一個服務器獲取到鎖
存儲redis的數據
此時進行并發測試
依舊保持35秒的睡眠時間
此時可以看到未拿到鎖的線程報錯
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: d904f2b9-e75d-472d-a5a6-d0a8cc603a80 thread-id: 210
嘗試解鎖鎖定,未被當前線程鎖定 按節點 ID:C731FAC4-9BF7-4F4A-ACC1-A2CC9B78A02F 線程 ID:232
這是因為鎖住了,所以無法獲取鎖,然后看門狗會不斷刷新
關于“SpringBoot怎么整合分布式鎖redisson”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。