>
3.14.0redisson
>
>
>
org.redissongroupid
>
>
redisson-spring-boot-starterartifactid
>
>
$version
>
dependency
>
# 基於redis集群
spring
:redis
:password
: ******
timeout
:5000
cluster
:# 集群,以逗號分隔的「主機:埠」對列表進行引導。
nodes
: 192.168.142.212:
6379
,192.168.142.211:
6379
,192.168.142.210:
6379
# 在群集中執行命令時要遵循的最大重定向數目
max-redirects:3
lettuce
:pool
:# 最小空閒連線 預設為 0
min-idle:0
# 最大空閒連線 預設為8
max-idle:15
# 最大連線數(使用負值表示沒有限制) 預設為8
max-active:15
# 最大阻塞等待時間(使用負值表示沒有限制) 預設為-1
max-wait:-1
shutdown-timeout
:100
@configuration
@slf4j
public
class
redissonconfig")
private string redisclusternodes;
@value
("$"
)private string password;
@bean
(destroymethod =
"shutdown"
)@conditionalonproperty
(name =
"spring.redis.cluster.nodes"
)public redissonclient redissonclient()
}
/**
* redisson分布式鎖實現
* 業務**中使用到分布式鎖的時候,用try{}catch{}finally{}包裝;
* catch中丟擲併發自定義異常
* finally中關閉鎖
* * @author : itoyoung
* @date : 2019-07-01 11:29:21
*/@component
@slf4j
public
class
redissonlock
/** * 按預設時間加鎖,預設三十秒
** @param lockkey
* @return
*/public rlock lockdefaulttime
(string lockkey)
/** * 自己設定超時時間
** @param lockkey 鎖的key
* @param timeout 秒 如果是-1,直到自己解鎖,否則不會自動解鎖
* @return rlock
*/public rlock lock
(string lockkey,
int timeout)
/***
* 自己設定超時時間
** @param lockkey 鎖
* @param unit 時間型別
* @param timeout 超時時間
* @return rlock
*/public rlock lock
(string lockkey, timeunit unit,
int timeout)
/** * 加鎖
** @param lockkey 鎖
* @param expireseconds 失效時間 秒
* @param waitmaxseconds 等待時間 秒
* @return boolean
*/public
boolean
trylock
(string lockkey, integer expireseconds, integer waitmaxseconds)
", lockkey);}
else
", lockkey);}
}catch
(interruptedexception e)
return res;
}/**
* 釋放鎖
** @param lockkey 鎖
*/public
void
unlock
(string lockkey)
", lockkey);}
elseif(
!lock.
islocked()
)", lockkey);}
elseif(
!lock.
isheldbycurrentthread()
)", lockkey);}
else
", lockkey);}
}/**
* 釋放鎖
** @param lock 鎖
*/public
void
unlock
(rlock lock)
}
兩張表,分別記錄狀態和count值,只有當status=『n』時,count++,初始值: status=『n』;count=0; 理想結果是狀態只更新一次了一次為』y』,count + 1;
@restcontroller
@slf4j
("/test/redissonlock"
)public
class
redissonlocktestcontroller")
public result lock
(@pathvariable
("lockname"
) string lockname)
}catch
(exception e)
finally
}else
return
newresult()
.defaultsuccess()
;}}@data
public
class
lockstatus
implements
serializable
@data
public
class
lockcount
implements
serializable
當我未設定分布式鎖時,用jmeter壓測,五百個執行緒,status = 'y』後,count竟然加了5次,顯然是有問題的。因為第一次把status更新為』y』後,後面的請求就應該查詢不到了。
我加上分布式鎖後再測試,結果就是正確的了
ps:有乙個點需要注意,加鎖的超時時間需要根據自己的業務**情況自行斟酌。若是被加鎖的業務**還未執行完成就超時失效了,那也會產生併發的情況
Redisson實現分布式鎖
引入包 org.redissongroupid redissonartifactid 3.10.0version dependency redissonconfig類 package com.xiepanpan.locks.lockstest.config import org.redisson.r...
RedisSon實現分布式鎖
主要步驟 1 引入redisson的依賴 2 配置redisson的配置類 3 使用redisson構建分布式鎖,在需要使用分布式鎖的地方注入redissonclient這個類來獲取鎖 第一步 引入依賴 org.springframework.boot spring boot starter par...
redisson實現分布式鎖
redisson官方文件 1.匯入相關依賴 這裡我只匯入redisson,其他還需要redis的依賴 org.redisson groupid redisson artifactid 3.12 5 version dependency 2.新增redisson核心配置 description red...