基于Redis分布式鎖Redisson及SpringBoot集成Redisson_第1頁
基于Redis分布式鎖Redisson及SpringBoot集成Redisson_第2頁
基于Redis分布式鎖Redisson及SpringBoot集成Redisson_第3頁
基于Redis分布式鎖Redisson及SpringBoot集成Redisson_第4頁
基于Redis分布式鎖Redisson及SpringBoot集成Redisson_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第基于Redis分布式鎖Redisson及SpringBoot集成Redisson目錄-分布式鎖需要具備的條件和剛需-Redisson使用-SpringBoot集成Redisson

-分布式鎖需要具備的條件和剛需

獨(dú)占性:OnlyOne,任何時(shí)刻只能有且僅有一個(gè)線程持有高可用:若redis集群環(huán)境下,不能因?yàn)槟骋粋€(gè)節(jié)點(diǎn)掛了而出現(xiàn)獲取鎖和釋放鎖失敗的情況防死鎖:杜絕死鎖,必須有超時(shí)控制機(jī)制或者撤銷操作,有個(gè)兜底終止跳出方案不亂搶:防止張冠李戴,不能私下unlock別人的鎖,只能自己加鎖自己釋放重入性:同一個(gè)節(jié)點(diǎn)的同一個(gè)線程如果獲得鎖之后,它也可以再次獲取這個(gè)鎖

-Redisson使用

引入redisson依賴:

dependency

groupIdorg.redisson/groupId

artifactIdredisson/artifactId

version3.16.2/version

/dependency

添加redisson配置:

importorg.redisson.Redisson;

importorg.redisson.config.Config;

importorg.springframework.context.annotation.Bean;

importorg.springframework.context.annotation.Configuration;

importorg.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

importorg.springframework.data.redis.core.RedisTemplate;

importorg.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;

importorg.springframework.data.redis.serializer.StringRedisSerializer;

importjava.io.Serializable;

@Configuration

publicclassRedisConfig{

@Bean

publicRedisTemplateString,SerializableredisTemplate(LettuceConnectionFactorylettuceConnectionFactory){

RedisTemplateString,SerializableredisTemplate=newRedisTemplate();

redisTemplate.setConnectionFactory(lettuceConnectionFactory);

//設(shè)置key序列號(hào)方式string

redisTemplate.setKeySerializer(newStringRedisSerializer());

//設(shè)置value的序列化方式j(luò)son

redisTemplate.setValueSerializer(newGenericJackson2JsonRedisSerializer());

redisTemplate.setHashKeySerializer(newStringRedisSerializer());

redisTemplate.setHashValueSerializer(newGenericJackson2JsonRedisSerializer());

redisTemplate.afterPropertiesSet();

returnredisTemplate;

@Bean

publicRedissonredisson(){

Configconfig=newConfig();

config.useSingleServer().setAddress("redis://33:6379").setDatabase(0);

return(Redisson)Redisson.create(config);

}

接口測(cè)試:

importorg.redisson.Redisson;

importorg.redisson.api.RLock;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.data.redis.core.StringRedisTemplate;

importorg.springframework.web.bind.annotation.GetMapping;

importorg.springframework.web.bind.annotation.RestController;

@RestController

publicclassTestController{

@Autowired

privateStringRedisTemplatestringRedisTemplate;

@Autowired

privateRedissonredisson;

privatestaticfinalStringKEY="spike";

@GetMapping("/buy")

publicStringbugGood(){

RLockredissonLock=redisson.getLock(KEY);

redissonLock.lock();

try{

Stringresult=stringRedisTemplate.opsForValue().get("goods:001");

intgoodNumber=result==null0:Integer.parseInt(result);

if(goodNumber0){

intrealNum=goodNumber-1;

stringRedisTemplate.opsForValue().set("goods:001",realNum+"");

return"秒殺成功,剩余庫(kù)存:"+realNum;

return"商品已售罄!";

}finally{

redissonLock.unlock();

}

多節(jié)點(diǎn)的情況下,代碼相同,要保證lock的key一樣

-SpringBoot集成Redisson

引入redis和redissonstarter:

!--/artifact/org.springframework.boot/spring-boot-starter-data-redis--

dependency

groupIdorg.springframework.boot/groupId

artifactIdspring-boot-starter-data-redis/artifactId

/dependency

!--/artifact/org.redisson/redisson--

dependency

groupIdorg.redisson/groupId

artifactIdredisson-spring-boot-starter/artifactId

/dependency

redis配置:

spring:

redis:

#地址

host:6

#端口,默認(rèn)為6379

port:6379

password:123456

#連接超時(shí)時(shí)間

timeout:30s

database:0

lettuce:

pool:

#連接池中的最小空閑連接

min-idle:0

#連接池中的最大空閑連接

max-idle:8

#連接池的最大數(shù)據(jù)庫(kù)連接數(shù)

max-active:8

##連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制)

max-wait:-1ms

redisson配置:

importorg.redisson.Redisson;

importorg.redisson.api.RedissonClient;

importorg.redisson.config.Config;

importorg.redisson.config.SingleServerConfig;

importorg.redisson.config.TransportMode;

importorg.springframework.beans.factory.annotation.Value;

importorg.springframework.context.annotation.Bean;

importorg.springframework.context.annotation.Configuration;

*redisson配置

@Configuration

publicclassRedissonConfig{

@Value("${spring.redis.host}")

privateStringhost;

@Value("${spring.redis.port}")

privateStringport;

@Value("${spring.redis.password}")

privateStringpassword;

@Bean

publicRedissonClientredissonClient(){

Configconfig=newConfig();

config.setTransportMode(TransportMode.NIO);

//單體配置,如果是SSL連接,使用rediss://

SingleServerConfigsingleServerConfig=config.useSingleServer();

singleServerConfig.setAddress("redis://"+host+":"+port);

singleServerConfig.setPassword(password);

returnRedisson.create(config);

}

使用:

importorg.redisson.api.RLock;

importorg.redisson.api.RedissonClient;

importjavax.annotation.Resource;

importjava.util.concurrent.TimeUnit;

publicclassTestController{

@Resource

privateRedissonClientredissonClient;

publicvoiddoAction1(){

StringlockKey="lockKey";

RLocklock=redissonClient.getLock(lockKey);

//加鎖,無參數(shù)

lock.lock();

//鎖有效時(shí)間,時(shí)間單位

//lock.lock(5,TimeUnit.SECONDS);

try{

//dosomething

}finally{

//解鎖

lock.unlock();

publicvoiddoAction2()throwsInterruptedException{

StringlockKey="lockKey";

RLocklock=redissonClient.getLock(lockKey);

//1.無參數(shù),直接上鎖

//lock.tryLock();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論