Redis分布式鎖之redisson


Redis分布式鎖之redisson

常用的redis解決方案:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pHt6m1O6-1601000482896)(C:\Users\VIolet\AppData\Roaming\Typora\typora-user-images\image-20200925095652120.png)]

redisson官網,官方講解可以點擊這里

redisson實現分布式鎖原理:
  • 線程首先會嘗試獲取鎖,如果獲取鎖成功,會執行加鎖操作並執行業務代碼,如果沒有成功會使用自旋鎖方式不斷嘗試獲取鎖
  • redisson為防止死鎖方式默認加鎖時間為30s,看門狗過30秒查看是否依然持有鎖,如果持有會延長時間,當業務執行完畢釋放鎖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-c9VoOX50-1601000482899)(C:\Users\VIolet\AppData\Roaming\Typora\typora-user-images\image-20200925095835130.png)]

1.maven依賴
 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.8.0</version> </dependency>
2.spring注入客戶端
package com.violet.sys.configuration; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Description //TODO * @Date 2020/3/19 22:32 * @Author huangwb **/ @Configuration public class RedissonAutoConfiguration { @Value("${redisson.addres}") private String addressUrl; @Value("${redisson.password}") private String password; /** * @return org.redisson.api.RedissonClient * @Author huangwb * @Description //TODO 單機模式配置 * @Date 2020/3/19 22:54 * @Param [] **/ @Bean public RedissonClient getRedisson() { Config config = new Config(); config.useSingleServer() .setAddress(addressUrl).setPassword(password) .setRetryInterval(50000) .setTimeout(100000) .setConnectTimeout(100000); return Redisson.create(config); } }
3對應的yml配置
redisson:
  addres: redis://127.0.0.1:6379
  password:  你的reids密碼 
4.業務邏輯代碼
4.1看門狗自動檢測鎖

這樣的代碼會出現一個看門狗,它的作用是在Redisson實例被關閉前,不斷的延長鎖的有效期,沒過10s檢測一遍,通過config.setLockWatchdogTimeout(“時間”)可以設置超時時間

package com.violet.sys.controller; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * TODO(描述) * * @author violet * @Title ReidsLock * @Description: * @date 2020/7/8 15:17 */ @RestController @Api(tags={"分布式鎖"}) public class ReidsLock { private Logger logger = LoggerFactory.getLogger(ReidsLock.class); @Autowired RedissonClient redissonClient; @RequestMapping(value = "redislock", method = RequestMethod.POST) @ApiOperation(value = "測試分布式鎖", notes = "接口描述", httpMethod = "POST") @ApiOperationSupport(author = "violet") public void redislock(){ //你鎖的id String key = "dec_store_lock" ; //1、獲取一把鎖,只要鎖的名字一樣,就是同一把鎖 RLock lock = redissonClient.getLock(key); lock.lock(); int i =0; logger.info(i+": 獲取鎖"); try { logger.info(i+": 打印鎖"); logger.info(String.valueOf(i)); i++; } catch (Exception e) { System.out.println(e.getMessage()); } finally { //解鎖 lock.unlock(); } } }
4.2 自行設置鎖超時時間
// 加鎖以后10秒鍾自動解鎖,不會續期 // 無需調用unlock方法手動解鎖 //10秒自動解鎖,自動解鎖時間一定要大於業務的執行時間。 lock.lock(10, TimeUnit.SECONDS); // 嘗試加鎖,最多等待100秒,超出不等,上鎖以后10秒自動解鎖 boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS); if (res) { try { ... } finally { lock.unlock(); } }
4.3設置公平鎖
RLock fairLock = redisson.getFairLock("dec_store_lock"); // 最常見的使用方法 fairLock.lock(); // 10秒鍾以后自動解鎖 // 無需調用unlock方法手動解鎖 fairLock.lock(10, TimeUnit.SECONDS); // 嘗試加鎖,最多等待100秒,上鎖以后10秒自動解鎖 boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS); ... fairLock.unlock(); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

``
接下來就可以用jmeter壓測了,我這里就不貼圖了

 
 


免責聲明!

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



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