redisson-spring-boot-starterRedisson Spring Boot 腳手架
redisson-spring-boot-starter
目前有很多項目還在使用jedis的 setNx 充當(dāng)分布式鎖,然而這個鎖是有問題的,redisson是java支持redis的redlock的唯一實現(xiàn), 官方目前只有java web版本,配置起來很麻煩.集成該項目后只需要極少的配置.就能夠使用redisson的全部功能. 目前支持集群模式,云托管模式,單Redis節(jié)點模式,哨兵模式,主從模式 配置. 支持 可重入鎖,公平鎖,聯(lián)鎖,紅鎖,讀寫鎖 鎖定模式
介紹
- 我們?yōu)槭裁葱枰?code>redisson?
redisson目前是官方唯一推薦的java版的分布式鎖,他支持redlock.具體請查看 官方文檔
- jedis為什么有問題?
目前jedis是只支持單機的.
jedis setNx 和設(shè)置過期時間是不同步的,在某些極端的情況下會發(fā)生死鎖.導(dǎo)致程序崩潰.如果沒有設(shè)置value, 線程1可能會釋放線程2的鎖 詳情看下這篇 博客
軟件架構(gòu)
- redisson
- spring boot
安裝教程
- 引入 pom.xml
<dependency>
<groupId>com.zengtengpeng</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
使用說明
- 在
application.properties增加
#單Redis節(jié)點模式 redisson.singleServerConfig.address=127.0.0.1:6379
2.在方法增加 @Lock 注解
//支持 spel 表達式 如果后面需要接字符串的話請用`+`連接. 字符串一定要打`單引號`
@Lock(keys = "#user.name+'locks'")
public String test(User user) {
System.out.println("進來了test");
return "test";
}
- 完畢
進階篇
@Lock 注解參數(shù)介紹
/**
* REENTRANT(可重入鎖),FAIR(公平鎖),MULTIPLE(聯(lián)鎖),REDLOCK(紅鎖),READ(讀鎖), WRITE(寫鎖),
* AUTO(自動模式,當(dāng)參數(shù)只有一個.使用 REENTRANT 參數(shù)多個 MULTIPLE)
*/
LockModel lockModel() default LockModel.AUTO;
/**
* 需要鎖定的keys
* @return
*/
String[] keys() default {};
/**
* 鎖超時時間,默認30000毫秒(可在配置文件全局設(shè)置)
* @return
*/
long lockWatchdogTimeout() default 0;
/**
* 等待加鎖超時時間,默認10000毫秒 -1 則表示一直等待(可在配置文件全局設(shè)置)
* @return
*/
long attemptTimeout() default 0;
如何使用redisson 客戶端實現(xiàn)自定義操作,只需要在spring 容器中注入redisson客戶端就行,如下:
@Autowired
private RedissonClient redissonClient;
集群模式配置(也可以使用yml寫法)
單例模式
單機版redis
#單Redis節(jié)點模式 redisson.singleServerConfig.address=127.0.0.1:6379
集群模式
集群模式除了適用于Redis集群環(huán)境,也適用于任何云計算服務(wù)商提供的集群模式,例如AWS ElastiCache集群版、Azure Redis Cache和阿里云(Aliyun)的云數(shù)據(jù)庫Redis版。
#集群模式 redisson.model=CLUSTER #redis機器.一直累加下去 redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379 redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380 redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381
云托管模式
云托管模式適用于任何由云計算運營商提供的Redis云服務(wù),包括亞馬遜云的AWS ElastiCache、微軟云的Azure Redis 緩存和阿里云(Aliyun)的云數(shù)據(jù)庫Redis版
#云托管模式 redisson.model=REPLICATED #redis機器.一直累加下去 redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379 redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380 redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381
哨兵模式
redisson.model=SENTINEL #主服務(wù)器的名稱是哨兵進程中用來監(jiān)測主從服務(wù)切換情況的。 redisson.multiple-server-config.master-name="mymaster" #redis機器.一直累加下去 redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379 redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380 redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381
主從模式
redisson.model=MASTERSLAVE #第一臺機器就是主庫.其他的為從庫 redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379 redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380 redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381
屬性列表(基本都是官方參數(shù).我將參數(shù)整合了下.分為 公共參數(shù),單例模式參數(shù),集群模式參數(shù))
1.公共參數(shù)
| 屬性名 | 默認值 | 備注 |
|---|---|---|
| redisson.password | 用于節(jié)點身份驗證的密碼。 | |
| redisson.attemptTimeout | 10000L | 等待獲取鎖超時時間,-1則是一直等待 |
| redisson.lockModel | 單個key默認可重入鎖多個key默認聯(lián)鎖 |
鎖的模式.如果不設(shè)置, REENTRANT(可重入鎖),FAIR(公平鎖),MULTIPLE(聯(lián)鎖),REDLOCK(紅鎖),READ(讀鎖), WRITE(寫鎖) |
| redisson.model | SINGLE | 集群模式:SINGLE(單例),SENTINEL(哨兵),MASTERSLAVE(主從),CLUSTER(集群),REPLICATED(云托管) |
| redisson.codec | org.redisson.codec.JsonJacksonCodec | Redisson的對象編碼類是用于將對象進行序列化和反序列化,以實現(xiàn)對該對象在Redis里的讀取和存儲 |
| redisson.threads | 當(dāng)前處理核數(shù)量 * 2 | 這個線程池數(shù)量被所有RTopic對象監(jiān)聽器,RRemoteService調(diào)用者和RExecutorService任務(wù)共同共享。 |
| redisson.nettyThreads | 當(dāng)前處理核數(shù)量 * 2 | 這個線程池數(shù)量是在一個Redisson實例內(nèi),被其創(chuàng)建的所有分布式數(shù)據(jù)類型和服務(wù),以及底層客戶端所一同共享的線程池里保存的線程數(shù)量。 |
| redisson.transportMode | NIO | TransportMode.NIO,TransportMode.EPOLL - 需要依賴?yán)镉衝etty-transport-native-epoll包(Linux) TransportMode.KQUEUE - 需要依賴?yán)镉?netty-transport-native-kqueue包(macOS) |
| redisson.idleConnectionTimeout | 10000 | 如果當(dāng)前連接池里的連接數(shù)量超過了最小空閑連接數(shù),而同時有連接空閑時間超過了該數(shù)值,那么這些連接將會自動被關(guān)閉,并從連接池里去掉。時間單位是毫秒 |
| redisson.connectTimeout | 10000 | 同任何節(jié)點建立連接時的等待超時。時間單位是毫秒。 |
| redisson.timeout | 3000 | 等待節(jié)點回復(fù)命令的時間。該時間從命令發(fā)送成功時開始計時。 |
| redisson.retryAttempts | 3 | 如果嘗試達到 retryAttempts(命令失敗重試次數(shù)) 仍然不能將命令發(fā)送至某個指定的節(jié)點時,將拋出錯誤。如果嘗試在此限制之內(nèi)發(fā)送成功,則開始啟用 timeout(命令等待超時) 計時。 |
| redisson.retryInterval | 1500 | 在一條命令發(fā)送失敗以后,等待重試發(fā)送的時間間隔。時間單位是毫秒。 |
| redisson.subscriptionsPerConnection | 5 | 每個連接的最大訂閱數(shù)量。 |
| redisson.clientName | 在Redis節(jié)點里顯示的客戶端名稱。 | |
| redisson.sslEnableEndpointIdentification | true | 開啟SSL終端識別能力。 |
| redisson.sslProvider | JDK | 確定采用哪種方式(JDK或OPENSSL)來實現(xiàn)SSL連接。 |
| redisson.sslTruststore | 指定SSL信任證書庫的路徑。 | |
| redisson.sslTruststorePassword | 指定SSL信任證書庫的密碼。 | |
| redisson.sslKeystore | 指定SSL鑰匙庫的路徑。 | |
| redisson.sslKeystorePassword | 指定SSL鑰匙庫的密碼。 | |
| redisson.lockWatchdogTimeout | 30000 | 監(jiān)控鎖的看門狗超時時間單位為毫秒。該參數(shù)只適用于分布式鎖的加鎖請求中未明確使用leaseTimeout參數(shù)的情況。如果該看門口未使用lockWatchdogTimeout去重新調(diào)整一個分布式鎖的lockWatchdogTimeout超時,那么這個鎖將變?yōu)槭顟B(tài)。這個參數(shù)可以用來避免由Redisson客戶端節(jié)點宕機或其他原因造成死鎖的情況。 |
| redisson.keepPubSubOrder | true | 通過該參數(shù)來修改是否按訂閱發(fā)布消息的接收順序出來消息,如果選否將對消息實行并行處理,該參數(shù)只適用于訂閱發(fā)布消息的情況。 |
- 單例模式參數(shù)
| 屬性名 | 默認值 | 備注 |
|---|---|---|
| redisson.singleServerConfig.address | 服務(wù)器地址,必填ip:port | |
| redisson.singleServerConfig.database | 0 | 嘗試連接的數(shù)據(jù)庫編號。 |
| redisson.singleServerConfig.subscriptionConnectionMinimumIdleSize | 1 | 用于發(fā)布和訂閱連接的最小保持連接數(shù)(長連接)。Redisson內(nèi)部經(jīng)常通過發(fā)布和訂閱來實現(xiàn)許多功能。長期保持一定數(shù)量的發(fā)布訂閱連接是必須的。 |
| redisson.singleServerConfig.subscriptionConnectionPoolSize | 50 | 用于發(fā)布和訂閱連接的連接池最大容量。連接池的連接數(shù)量自動彈性伸縮。 |
| redisson.singleServerConfig.connectionMinimumIdleSize | 32 | 最小保持連接數(shù)(長連接)。長期保持一定數(shù)量的連接有利于提高瞬時寫入反應(yīng)速度。 |
| redisson.singleServerConfig.connectionPoolSize | 64 | 連接池最大容量。連接池的連接數(shù)量自動彈性伸縮。 |
| redisson.singleServerConfig.dnsMonitoringInterval | 5000 | 用來指定檢查節(jié)點DNS變化的時間間隔。使用的時候應(yīng)該確保JVM里的DNS數(shù)據(jù)的緩存時間保持在足夠低的范圍才有意義。用-1來禁用該功能。 |
- 集群模式
| 屬性名 | 默認值 | 備注 |
|---|---|---|
| redisson.multiple-server-config.node-addresses | 服務(wù)器節(jié)點地址.必填 redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379 redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380 redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381 |
|
| redisson.multiple-server-config.loadBalancer | org.redisson.connection.balancer.RoundRobinLoadBalancer | 在多Redis服務(wù)節(jié)點的環(huán)境里,可以選用以下幾種負載均衡方式選擇一個節(jié)點: org.redisson.connection.balancer.WeightedRoundRobinBalancer - 權(quán)重輪詢調(diào)度算法 org.redisson.connection.balancer.RoundRobinLoadBalancer - 輪詢調(diào)度算法 org.redisson.connection.balancer.RandomLoadBalancer - 隨機調(diào)度算法 |
| redisson.multiple-server-config.slaveConnectionMinimumIdleSize | 32 | 多從節(jié)點的環(huán)境里,每個 從服務(wù)節(jié)點里用于普通操作(非 發(fā)布和訂閱)的最小保持連接數(shù)(長連接)。長期保持一定數(shù)量的連接有利于提高瞬時讀取反映速度。 |
| redisson.multiple-server-config.slaveConnectionPoolSize | 64 | 多從節(jié)點的環(huán)境里,每個 從服務(wù)節(jié)點里用于普通操作(非 發(fā)布和訂閱)連接的連接池最大容量。連接池的連接數(shù)量自動彈性伸縮。 |
| redisson.multiple-server-config.masterConnectionMinimumIdleSize | 32 | 多節(jié)點的環(huán)境里,每個 主節(jié)點的最小保持連接數(shù)(長連接)。長期保持一定數(shù)量的連接有利于提高瞬時寫入反應(yīng)速度。 |
| redisson.multiple-server-config.masterConnectionPoolSize | 64 | 多主節(jié)點的環(huán)境里,每個 主節(jié)點的連接池最大容量。連接池的連接數(shù)量自動彈性伸縮。 |
| redisson.multiple-server-config.readMode | SLAVE | 設(shè)置讀取操作選擇節(jié)點的模式。 可用值為: SLAVE - 只在從服務(wù)節(jié)點里讀取。 MASTER - 只在主服務(wù)節(jié)點里讀取。 MASTER_SLAVE - 在主從服務(wù)節(jié)點里都可以讀取。 |
| redisson.multiple-server-config.subscriptionMode | SLAVE | 設(shè)置訂閱操作選擇節(jié)點的模式。 可用值為: SLAVE - 只在從服務(wù)節(jié)點里訂閱。 MASTER - 只在主服務(wù)節(jié)點里訂閱。 |
| redisson.multiple-server-config.subscriptionConnectionMinimumIdleSize | 1 | 用于發(fā)布和訂閱連接的最小保持連接數(shù)(長連接)。Redisson內(nèi)部經(jīng)常通過發(fā)布和訂閱來實現(xiàn)許多功能。長期保持一定數(shù)量的發(fā)布訂閱連接是必須的。 redisson.multiple-server-config.subscriptionConnectionPoolSize |
| redisson.multiple-server-config.dnsMonitoringInterval | 5000 | 監(jiān)測DNS的變化情況的時間間隔。 |
| redisson.multiple-server-config.scanInterval | 1000 | (集群,哨兵,云托管模特特有) 對Redis集群節(jié)點狀態(tài)掃描的時間間隔。單位是毫秒。 |
| redisson.multiple-server-config.database | 0 | (哨兵模式,云托管,主從模式特有)嘗試連接的數(shù)據(jù)庫編號。 |
| redisson.multiple-server-config.masterName | (哨兵模式特有)主服務(wù)器的名稱是哨兵進程中用來監(jiān)測主從服務(wù)切換情況的。 |
評論
圖片
表情
