军团:修改锁逻辑

This commit is contained in:
luying
2021-02-23 10:08:20 +08:00
parent 41b57d0e04
commit 97e5456b21
4 changed files with 70 additions and 21 deletions
+37 -2
View File
@@ -11,6 +11,8 @@ export class RedlockService {
_redisClient: any;
ttl: number;
redlock: any;
redlockNoRetry: any; // 用于检查锁是否存在,一锁上立刻会解锁
constructor(redisClient) {
this._redisClient = redisClient;
this._redisClient.on("error", function (err) {
@@ -41,6 +43,20 @@ export class RedlockService {
this.redlock.on('clientError', function(err) {
console.error('A redis error has occurred:', err);
});
this.redlockNoRetry = new Redlock(
[this._redisClient],
{
driftFactor: 0.01, // time in ms
retryCount: 0,
retryDelay: 200, // time in ms
retryJitter: 200 // time in ms
}
);
this.redlockNoRetry.on('clientError', function(err) {
console.error('A redis error has occurred:', err);
});
}
}
@@ -51,6 +67,7 @@ export async function lockData(serverId: number, dataName: string, id: string )
console.log(' lockKey = '+ lockKey);
return await lock(lockKey);
}
function lock(lockKey: string) {
return _redlockCache.redlock.lock(lockKey, _redlockCache.ttl).then(function(lock) {
setLock(lockKey, lock);
@@ -64,8 +81,26 @@ export async function releaseCallback(lockKey: string) {
releaseLock(lockKey);
}
export async function isLocked(serverId: number, dataName: string, id: string) {
/**
* 主要用于检查是否锁定,锁上后立刻会解锁,所以entryCount为0
*
* @param serverId 区服
* @param dataName 锁名
* @param id 锁id
*/
export async function lockDataNoRetry(serverId: number, dataName: string, id: string ) {
let key = 'serverId_'+serverId+'_'+dataName+'_'+id;
let lockKey = 'locks:' + key;
return getLock(lockKey);
console.log(' lockKey = '+ lockKey);
return await lockNoRetry(lockKey);
}
function lockNoRetry(lockKey: string) {
return _redlockCache.redlockNoRetry.lock(lockKey, _redlockCache.ttl).then(function(lock) {
setLock(lockKey, lock);
return {err: null, releaseCallback: releaseCallback.bind(null, lockKey)};
}).catch(function(err) {
console.error(err);
return { err };
});
}