Redis集群利用Redisson實(shí)現(xiàn)分布式鎖方式
更新時(shí)間:2024年05月15日 16:46:51 作者:-luking-
這篇文章主要介紹了Redis集群利用Redisson實(shí)現(xiàn)分布式鎖方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
Redisson實(shí)現(xiàn)集群環(huán)境下的分布式鎖十分簡單:
引入依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.lk</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> //Redis起步依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.7.RELEASE</version> </dependency> //Redisson起步依賴 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.11.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Redisson配置類
package com.lk.demo.redissionconfig; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /* * Redisson的配置類,提供RedissonClient實(shí)例 * */ @Configuration public class RedissionConfiguration { @Bean public RedissonClient getRedissionClient(){ Config config=new Config(); //集群模式,集群節(jié)點(diǎn)的地址須使用“redis://”前綴,否則將會(huì)報(bào)錯(cuò)。 //此例集群為3節(jié)點(diǎn),各節(jié)點(diǎn)1主1從 config.useClusterServers().addNodeAddress("redis://192.168.37.134:7001","redis://192.168.37.134:7002", "redis://192.168.37.134:7003","redis://192.168.37.134:7004","redis://192.168.37.134:7005","redis://192.168.37.134:7006"); return Redisson.create(config); } }
分布式鎖
package com.lk.demo.redissionconfig; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Repository; import java.util.concurrent.TimeUnit; /* * 利用RedissonClient部署及解除分布式鎖 * 直接調(diào)用lock、unlock方法,此方法只允許1個(gè)線程取得鎖,其余線程將自旋等待 * */ @Repository public class HandlerLock{ @Autowired private RedisTemplate<String,String> rt; //@Qualifier("redisson") //在org.redisson.spring.starter包中,可以從配置文件讀取redis配置,并返回redissonclient對象 @Qualifier("getRedissionClient")//指定從本地自寫的class中取得實(shí)例 @Autowired private RedissonClient redissonClient; //實(shí)驗(yàn)方法,測試分布式鎖 public void doLock(String lockname){ //從RedissonClient取得Rlock實(shí)例 RLock rlock=redissonClient.getLock(lockname); //嘗試取鎖,有效期為3s,到期后自動(dòng)釋放。如果取得鎖繼續(xù)執(zhí)行。取鎖失敗則自旋。 //亦可使用rlock.tryLock()方法,此方法也為嘗試取鎖,并返回boolean結(jié)果 rlock.lock(3,TimeUnit.SECONDS); //以下為測試業(yè)務(wù)代碼, System.out.println(Thread.currentThread().getName()+"取得鎖"); int store=Integer.valueOf(rt.opsForValue().get("store")); if(store>0) { System.out.printf("售出1,當(dāng)前庫存為%d\n",--store); rt.opsForValue().set("store",String.valueOf(store)); }else System.out.println("已售完,下次再來吧"); //業(yè)務(wù)完成,釋放鎖 rlock.unlock(); System.out.println("解鎖"); } }
測試Controller
@Controller public class Controllerdemo { @Autowired private HandlerLock handlerLock; @RequestMapping("/hello") @ResponseBody public void demo(){ handlerLock.doLock("luking"); } }
并發(fā)測試
啟動(dòng)SpringBoot,使用Jmeter進(jìn)行并發(fā)壓力測試,Redis中store字段現(xiàn)有值100。
500線程并發(fā),循環(huán)2次
控制臺(tái)結(jié)果輸出
redis緩存
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程
但有時(shí)候想在windows下折騰下Redis,那么就可以參考下面的方法了,雖然腳本之家小編以前整理了一些,發(fā)現(xiàn)這篇做的比較詳細(xì),下載也給出來了2018-08-08Redis有序集合類型的操作_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
今天通過本文給大家說一下Redis中最后一個(gè)數(shù)據(jù)類型 “有序集合類型”,需要的的朋友參考下吧2017-08-08