分布式redislock使用注意事項

2022-03-27 09:58:22 字數 2307 閱讀 3726

採用技術框架:csredis 

業務邏輯:單個資料做判重,不重複增加,後續update

實現:使用redislock +分布式redis key的方式雙重機制

問題:乙個過程耗時72s

**:

public async taskaddbasiccustomerlog(baseempinfo empinfo, long buid, datetime datatime, idbconnection connection, idbtransaction transaction = null)

thread.sleep(3000);//等待3s

}i++;

if (i > 3)

}if (connection.state != connectionstate.open)

//獲取鎖後再次檢視是否已有 如果沒有就新增

var statisdefeat = await _statiscustomerlogrepository.getstatiscustomeridbyempid(buid, datatime, connection, transaction);

if (statisdefeat <= 0)

else

//await _database.lockreleaseasync(lockkey, token);

lockredis?.unlock();

stopwatch.stop();

if (stopwatch.elapsed.totalseconds > 2)

return res;

}

問題1:如果是乙個已存在的資料 那麼 可能存在沒有釋放lock , return statisdefeat;這一步

問題2:lock 沒有釋放,自動延期

問題3:lockrediskey 不唯一

/// 開啟分布式鎖,若超時返回null

/// 鎖名稱

/// 超時(秒)

/// 自動延長鎖超時時間,看門狗執行緒的超時時間為timeoutseconds/2 , 在看門狗執行緒超時時間時自動延長鎖的時間為timeoutseconds。除非程式意外退出,否則永不超時。

///

public static csredisclientlock lock(

string name,

int timeoutseconds,

bool autodelay = true)

/// 開啟分布式鎖,若超時返回null

/// 鎖名稱

/// 超時(秒)

/// 自動延長鎖超時時間,看門狗執行緒的超時時間為timeoutseconds/2 , 在看門狗執行緒超時時間時自動延長鎖的時間為timeoutseconds。除非程式意外退出,否則永不超時。

///

public csredisclientlock lock(string name, int timeoutseconds, bool autodelay = true)

return (csredisclientlock) null;

}

解決方案:1:return 前一定釋放lock 2:redislock設定為可過期的 3:設定rediskey的時候設定成業務唯一的

新**

public async taskaddbasiccustomerlog(baseempinfo empinfo, long buid, long compid, datetime datatime, idbconnection connection, idbtransaction transaction = null)

thread.sleep(3000);//等待3s

}i++;

if (i > 3)

}if (connection.state != connectionstate.open)

//獲取鎖後再次檢視是否已有 如果沒有就新增

var statisdefeat = await _statiscustomerlogrepository.getstatiscustomeridbyempid(buid, datatime, connection, transaction);

if (statisdefeat <= 0)

else

//await _database.lockreleaseasync(lockkey, token);

lockredis?.unlock();

stopwatch.stop();

if (stopwatch.elapsed.totalseconds > 2)

return res;

}

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式 分布式事務

是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...

dubbo zookeeper分布式使用

換了專案組 今天開始接觸dubbo 高分布式開發,於是上網找了很多資料,現在來具體的總結一下 dubbo zookeeper的具體使用,後續研究與spring的整合搭建,現在只記錄使用流程。既然是搞分布式,一般情況下會有兩台及以上伺服器,現在以兩台為例。s1為服務提供者,s2為服務呼叫者。s2如果要...