Exemple #1
0
        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);
        }
Exemple #2
0
        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;
        }