配置地址:
1
2
3
4
|
redisson: # Redis服務地址 如果集群使用","進行分割 server-address: redis: // ${spring.redis.host}:${spring.redis.port} database: ${spring.redis.database} |
創建配置類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@ConfigurationProperties(prefix = "redisson" ) @Configuration public class RedissonConfig { /** Redis服務地址 如果集群使用 "," 進行分割 */ private String serverAddress; private Integer database; public String getServerAddress() { return serverAddress; } public void setServerAddress(String serverAddresss) { this.serverAddress = serverAddresss; } public Integer getDatabase() { return database; } public void setDatabase(Integer database) { this.database = database; } } |
注冊redission Bean:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/** * RedissonClient * @ return */ @Bean public RedissonClient redissonClient(){ String splitChar = "," ; String serverAddress = redissonConfig.getServerAddress(); String[] serverAddressArr = serverAddress. split (splitChar); Config config = new Config(); if (serverAddressArr.length == 1) { // 單例redis config.useSingleServer() .setAddress(redissonConfig.getServerAddress()) .setDatabase(redissonConfig.getDatabase()); } else { // 集群redis config.useClusterServers().addNodeAddress(serverAddressArr); } return Redisson.create(config); } |
防止重復初始化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
** * 初始化告警統計記錄 保證告警統計不會被重復初始化 * * @param areaId 部門 id * @throws BizException */ public void initWarningStatisticsSafe(String areaId) throws BizException { // 創建鎖名稱 String lockName = generateInitWarningStatisticsLockName(areaId); RLock lock = redisClient.getLock(lockName); try { // 嘗試獲取鎖 (最多嘗試10秒,獲取到后15秒后釋放鎖) boolean isAcquireLock = lock.tryLock(10, 15, TimeUnit.SECONDS); if (!isAcquireLock) { logger.error( "初始化消息統計 --- 獲取鎖失敗 lockName = " + lockName); throw new BizException( "系統異常" ); } else { try { // 查詢【告警統計】 (能夠查詢到最新的數據,因為默認隔離級別是 read committed List<WarningStatisticsPO> warningStatisticsPOS = warningStatisticsDAO.selectByArea(areaId); if (CollectionUtils.isEmpty(warningStatisticsPOS)) { // 如果部門不存在告警統計,才進行初始化 initWarningStatistics()會開啟一個新事務 warningStatisticsService.initWarningStatistics(areaId); } } finally { // 釋放鎖 (在事務提交后才釋放鎖。保證其它事務在獲取鎖后能查詢到數據,不會再進行初始化。) lock.unlock(); } } } catch (InterruptedException e) { e.printStackTrace(); } } |
到此這篇關于redission分布式鎖防止重復初始化問題的文章就介紹到這了,更多相關redission分布式鎖內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/qq_41434746/article/details/109841021