Example #1
0
        public void RedisLockTest()
        {
            int count    = 0;
            var tasklist = new List <Task>();

            for (var i = 0; i < 200; ++i)
            {
                tasklist.Add(Task.Run(() =>
                {
                    try
                    {
                        using (var @lock = new RedisDistributedLock(nameof(RedisLockTest)))
                        {
                            ++count;
                        }
                    }
                    catch (Exception e)
                    {
                        //
                    }
                }));
            }
            Task.WaitAll(tasklist.ToArray());

            count.ToString();
        }
Example #2
0
        public async ValueTask <IAcquiredLock> AcquireLock(string lockKey, CancellationToken cancellationToken)
        {
            var @lock    = new RedisDistributedLock(lockKey, _database, builder => builder.Expiry(_options.LockExpiry));
            var acquired = await @lock.AcquireAsync(null, cancellationToken);

            return(new RedisAcquiredLockWrapper(acquired));
        }
Example #3
0
        public void TestName()
        {
            const string Name  = "\0🐉汉字\b\r\n\\";
            var          @lock = new RedisDistributedLock(Name, new Mock <IDatabase>(MockBehavior.Strict).Object);

            @lock.Name.ShouldEqual(Name);
            @lock.Key.ShouldEqual(new RedisKey(Name));
        }
        public bool Execute()
        {
            if (buyerId == null || (sellerId == null || amount < 0.0))
            {
                throw new InvalidTransactionException("This is an invalid transaction");
            }

            if (status == STATUS.EXECUTED)
            {
                return(true);
            }

            bool isLocked = false;

            try
            {
                isLocked = RedisDistributedLock.GetSingletonInstance().Lock(id);

                // 锁定未成功,返回false
                if (!isLocked)
                {
                    return(false);
                }

                if (status == STATUS.EXECUTED)
                {
                    return(true);                           // double check
                }
                long executionInvokedTimestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
                // 交易超过20天
                if (executionInvokedTimestamp - createdTimestamp > 1728000000)
                {
                    this.status = STATUS.EXPIRED;
                    return(false);
                }

                IWalletService walletService       = new WalletServiceImpl();
                string         walletTransactionId = walletService.MoveMoney(id, buyerId, sellerId, amount);
                if (walletTransactionId != null)
                {
                    this.walletTransactionId = walletTransactionId;
                    this.status = STATUS.EXECUTED;
                    return(true);
                }
                else
                {
                    this.status = STATUS.FAILED;
                    return(false);
                }
            }
            finally
            {
                if (isLocked)
                {
                    RedisDistributedLock.GetSingletonInstance().Unlock(id);
                }
            }
        }
Example #5
0
        public override IDistributedLock CreateLockWithExactName(string name)
        {
            var @lock = new RedisDistributedLock(name, this.Strategy.DatabaseProvider.Databases, this.Strategy.Options);

            this.Strategy.RegisterKillHandleAction(
                () => this.Strategy.DatabaseProvider.Databases.Take((this.Strategy.DatabaseProvider.Databases.Count / 2) + 1)
                .ToList()
                .ForEach(db => db.KeyDelete(@lock.Key))
                );
            return(@lock);
        }
Example #6
0
        static void DistLock()
        {
            var connection = ConnectionMultiplexer.Connect("192.168.66.60"); // uses StackExchange.Redis

            connection.GetDatabase().WithKeyPrefix("lock");
            IDistributedLock dlock = new RedisDistributedLock("MyLockName", connection.GetDatabase(2));

            using (var handle = dlock.TryAcquire())
            {
                if (handle != null)
                {
                    Console.WriteLine("Locked");
                    Thread.Sleep(TimeSpan.FromSeconds(60));
                    /* I have the lock */
                    Console.WriteLine("Unlocked");
                }
            }
        }