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(); }
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)); }
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); } } }
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); }
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"); } } }