public static async Task <bool> SafedUnLockAsync(this IDatabase redisDb, string cacheKey, string lockValue) { ArgumentCheck.NotNullOrWhiteSpace(cacheKey, nameof(cacheKey)); ArgumentCheck.NotNullOrWhiteSpace(lockValue, nameof(lockValue)); var lockKey = GetLockKey(cacheKey); AutoDelayTimers.Instance.CloseTimer(lockKey); var script = @"local invalue = @value local currvalue = redis.call('get',@key) if(invalue==currvalue) then redis.call('del',@key) return 1 else return 0 end"; var parameters = new { key = lockKey, value = lockValue }; var prepared = LuaScript.Prepare(script); var result = (int)await redisDb.ScriptEvaluateAsync(prepared, parameters); return(result == 1); }
internal static void Delay(IDatabase redisDb, string key, string value, int milliseconds) { if (!AutoDelayTimers.Instance.ContainsKey(key)) { return; } // local ttltime = redis.call('PTTL', @key) var script = @"local val = redis.call('GET', @key) if val==@value then redis.call('PEXPIRE', @key, @milliseconds) return 1 end return 0"; object parameters = new { key, value, milliseconds }; var prepared = LuaScript.Prepare(script); var result = redisDb.ScriptEvaluateAsync(prepared, parameters, CommandFlags.None).GetAwaiter().GetResult(); if ((int)result == 0) { AutoDelayTimers.Instance.CloseTimer(key); } return; }