Redisson分布式鎖實現

2021-10-22 22:50:36 字數 4037 閱讀 6626

>

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...