分布式锁 乐观锁(二)

本文介绍了 redis 乐观锁

使用的是 Nuget ServiceStack

乐观锁的核心是用户每次抢购 直接返回结果 用户不用等待 ,如果还想抢购用户再次发起请求抢购

第一次抢

第二次抢 

 第三次抢 库存就没有了

 

上代码

  /// <summary>
    /// 乐观锁
    /// </summary>
    public class OptimismLock
    {
        public static readonly string OptimismLockKey = "Optimismlock";
        public static readonly string OptimismKey = "OptimismTotal";
        public static readonly string Prefix = "lock";
        /// <summary>
        /// 乐观锁
        /// </summary>
        public static void OptimismLockTest()
        {
            using (RedisClient redisClient = new RedisClient("192.168.0.168:6379"))
            {
                bool result = redisClient.Add<string>(Prefix + OptimismLockKey, OptimismLockKey, TimeSpan.FromSeconds(1));
                if (!result)
                {
                    Console.WriteLine($"没有抢到锁---当前线程为{Thread.CurrentThread.ManagedThreadId}");
                    return;
                }
                try
                {
                    //这里也会出现业务时间过长 导致多个线程 拿到锁的情况
                    int total = redisClient.Get<int>(OptimismLock.OptimismKey);
                    if (total <= 0)
                    {
                        Console.WriteLine($"已经抢完你来晚了,当前线程为{Thread.CurrentThread.ManagedThreadId}");
                        return;
                    }
                    total = total - 1;
                    redisClient.Set(OptimismLock.OptimismKey, total);
                    Console.WriteLine($"抢到锁总数为{total}--当前线程为{Thread.CurrentThread.ManagedThreadId}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"报错当前线程为{Thread.CurrentThread.ManagedThreadId},{ex.Message}");
                }
                finally
                {
                    redisClient.Remove(Prefix + OptimismLockKey);
                }
            }
        }
    }

  

 

posted on 2023-11-11 22:52  是水饺不是水饺  阅读(7)  评论(0)    收藏  举报

导航