Exemplo n.º 1
0
        private RedLock(
            ILogger <RedLock> logger,
            ICollection <RedisConnection> redisCaches,
            string resource,
            TimeSpan expiryTime,
            TimeSpan?waitTime  = null,
            TimeSpan?retryTime = null,
            RedLockRetryConfiguration retryConfiguration = null,
            CancellationToken?cancellationToken          = null)
        {
            this.logger = logger;

            if (expiryTime < minimumExpiryTime)
            {
                logger.LogWarning($"Expiry time {expiryTime.TotalMilliseconds}ms too low, setting to {minimumExpiryTime.TotalMilliseconds}ms");
                expiryTime = minimumExpiryTime;
            }

            if (retryTime != null && retryTime.Value < minimumRetryTime)
            {
                logger.LogWarning($"Retry time {retryTime.Value.TotalMilliseconds}ms too low, setting to {minimumRetryTime.TotalMilliseconds}ms");
                retryTime = minimumRetryTime;
            }

            this.redisCaches = redisCaches;

            quorum             = redisCaches.Count / 2 + 1;
            quorumRetryCount   = retryConfiguration?.RetryCount ?? 3;
            quorumRetryDelayMs = retryConfiguration?.RetryDelayMs ?? 400;
            clockDriftFactor   = 0.01;

            Resource               = resource;
            LockId                 = Guid.NewGuid().ToString();
            this.expiryTime        = expiryTime;
            this.waitTime          = waitTime;
            this.retryTime         = retryTime;
            this.cancellationToken = cancellationToken ?? CancellationToken.None;
        }
Exemplo n.º 2
0
        internal static async Task <RedLock> CreateAsync(
            ILogger <RedLock> logger,
            ICollection <RedisConnection> redisCaches,
            string resource,
            TimeSpan expiryTime,
            TimeSpan?waitTime  = null,
            TimeSpan?retryTime = null,
            RedLockRetryConfiguration retryConfiguration = null,
            CancellationToken?cancellationToken          = null)
        {
            var redisLock = new RedLock(
                logger,
                redisCaches,
                resource,
                expiryTime,
                waitTime,
                retryTime,
                retryConfiguration,
                cancellationToken);

            await redisLock.StartAsync().ConfigureAwait(false);

            return(redisLock);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Create a RedLockFactory using existing StackExchange.Redis ConnectionMultiplexers
        /// </summary>
        public static RedLockFactory Create(IList <RedLockMultiplexer> existingMultiplexers, ILoggerFactory loggerFactory = null, RedLockRetryConfiguration retryConfiguration = null)
        {
            var configuration = new RedLockConfiguration(
                new ExistingMultiplexersRedLockConnectionProvider
            {
                Multiplexers = existingMultiplexers
            },
                loggerFactory)
            {
                RetryConfiguration = retryConfiguration
            };

            return(new RedLockFactory(configuration));
        }
Exemplo n.º 4
0
        /// <summary>
        /// Create a RedLockFactory using a list of RedLockEndPoints (ConnectionMultiplexers will be internally managed by RedLock.net)
        /// </summary>
        public static RedLockFactory Create(IList <RedLockEndPoint> endPoints, ILoggerFactory loggerFactory = null, RedLockRetryConfiguration retryConfiguration = null)
        {
            var configuration = new RedLockConfiguration(endPoints, loggerFactory)
            {
                RetryConfiguration = retryConfiguration
            };

            return(new RedLockFactory(configuration));
        }