分布式锁就不多介绍了,刚好有一个这样的需求,就上github上找一找,发现一个分布式锁的项目,使用的是redis

项目地址:https://github.com/samcook/RedLock.net

首先使用nuget安装dll

 RedLock.net

我这边做了一个模拟测试,因为实在太简单了,直接看注释就可以了

        static int MAX_THREAD = 5;//模拟5个线程

        static void Main(string[] args)
        {

            var start = DateTime.Now;

            var endPoints = new List<RedLockEndPoint>
            {
                new DnsEndPoint("172.28.3.125", 6379),
            };
            var redlockFactory = RedLockFactory.Create(endPoints);
             
            List<Task> list = new List<Task>();
            for (int i = 0; i < MAX_THREAD; i  )
            {
                Task t = new Task(() =>
                {
                    for (int index = 0; index < 100; index  )
                    { 
                        var id = index % 10; 
                        var expiry = TimeSpan.FromSeconds(30);
                        var key = "key"   id;
                        var wait = TimeSpan.FromSeconds(30);
                        var retry = TimeSpan.FromSeconds(1);
                        using (var redLock = redlockFactory.CreateLock(key, expiry, wait, retry))
                        {
                            if (redLock.IsAcquired)
                            {
                                var info = LockTestDAL.GetLockTestInfo(id);
                                info.Result1  ;
                                LockTestDAL.Update(info);
                                info.Result2  ;
                                LockTestDAL.Update(info);
                                info.Result3  ;
                                LockTestDAL.Update(info);
                            }
                        } 
                    }
                });
                list.Add(t);
            }
            for (int i = 0; i < list.Count; i  )
            {
                list[i].Start();
            }

            Task.WaitAll(list.ToArray());

            Console.WriteLine("done");
            var d = (DateTime.Now - start).TotalSeconds;
            Console.WriteLine($"耗时{d}秒");
            Console.ReadLine(); 
        }

其中有几个参数

expiry是指的超时时间,如果内部执行超过expity则会释放锁

key就是锁定时候的数据特征,一般是主键

wait是指获取锁的时候等待的时间

retry是指每隔多少时间请求一次。

 

一定要注意,锁不是一定能拿到的,所以需要加判断

if (redLock.IsAcquired) //判断是否拿到锁

 

在我的测试用例中,表中有多个数据需要更新,如果不加锁的话会有脏读脏写,数据明显错误,执行大概34秒。

加锁之后数据完全正确,执行时间会稍长,大概38秒。


Leave a Reply