c# .NET 高级编程 高并发必备技巧(二) - 分布式锁
时间:2023-08-24 08:32:42来源:博客园


(资料图片)

上一篇文章简单的介绍了单机的情况下如何进行加锁,防止高并发带来的问题。然而现实中,一般会高并发的应用,很少会单机部署。当用户量达到一定的程度,分布式、集群部署是必然的选择。在分布式部署的情况下,之前的单机锁还会有效吗?代码还是之前的代码:

private static object lck = new object();    ///     /// 单机锁    ///     ///     ///     [HttpGet]    public  int Reduce1()    {        lock(lck)        {            int r = 0;            string key = "stock";            string stock = Rds.cli.Get(key);            r = int.Parse(stock);            if (r > 0)            {                r--;                Rds.cli.Set(key, r);            }            else            {                throw new Exception("库存用尽!");            }            return r;        }    } 

今天再来测试一下,首先在本机模拟分布式的部署。api 部署3个,分别对应的端口 1020、1021、1022。使用nginx进行负载均衡转发,Nginx简单配置信息如下:Jmeter请求的接口是nginx的8000,请求线程和上一次一样100*101000次请求后,再去查库存,发现库存并不为0。所以单机锁,在分布式的情况下,根本没起作用。

所以在分布式的情况下,必须要借助第三方的中间件。Redis是其中比较常见的解决方案,以下是简单的实现代码:

///     /// 分布式锁    ///     ///     ///     [HttpGet]    public int Reduce2()    {        bool Lck1 =false;        int r = 0;        string identity=Guid.NewGuid().ToString(); //设置识别,避免错误释放锁。        int OverTime = 10; //根据实际业务场景设置 超时时间,避免出现死锁        try        {            Lck1 = Rds.cli.SetNx("lock", identity, OverTime);            while (!Lck1)            {                Lck1 = Rds.cli.SetNx("lock", identity, OverTime);            }            string key = "stock";            string stock = Rds.cli.Get(key);            r = int.Parse(stock);            if (r > 0)            {                r--;                Rds.cli.Set(key, r);            }            else            {                throw new Exception("库存用尽!");            }        }        catch (Exception ex)        {            throw;        }        finally        {            string id = Rds.cli.Get("lock");            if(id==identity)            {                Rds.cli.Del("lock");            }        }        return r;    }

再次通过Jmeter 请求nginx 的端口。经过改造后的代码方法,在1000次请求后,库存已经为0。说明此次的分布式锁是有效的。

需要注意的是,要避免死锁,所以加锁的时候,要根据业务场景 设置 过期时间。为了避免释放错误,加锁的时候也要加上身份认证。

好了此次关于锁的分享完毕。

标签:

最新
  • c# .NET 高级编程 高并发必备技巧(二) - 分布式锁

    上一篇文章简单的介绍了单机的情况下如何进行加锁,防止高并发带来的问

  • 房山已累计进行灾后消杀4000余万平方米

    北京日报客户端|记者陈强安旭东“要及时清理垃圾积水,消除蚊蝇孳生环

  • 中江县总工会“相约凯城·会聚良缘——甜蜜消费季”交友派对举行

    为切实解决中江县单身青年职工交友需求,拓宽沟通交友渠道,搭建一个健

  • 清廉家风进企业--桂林市自来水有限公司开展“玫瑰书香 阅读与清廉家风”读书分享会活动

    为加强家庭家教家风建设,助力涵养清风正气了,近日,桂林市自来水有限

  • 书展·人物丨奚美娟:阅读的过程,就是从“围坐”变成“独坐”

    昨天,奚美娟做客思南文学之家,与陈思和教授、杨扬教授、作家潘向黎一

  • 直击上海首例遗嘱指定监护案:去世前6天,重病的她留下遗嘱将独子托付给姐姐

    这是一场特殊的庭审。双方不是原告和被告,不是公诉人和被告人,而是申

  • 2023亚布力中国企业家论坛第十九届夏季高峰会将在深圳举办 聚焦大湾区 创新促发展

    8月22日,记者获悉,2023亚布力中国企业家论坛第十九届夏季高峰会以“

  • 销售朋友圈经典句子

    “和时间的约会,感受美丽的流动。”“商务升华,一起创造无限可能。”

  • 弘宇股份(002890.SZ)发布上半年业绩,净利润1066.16万元,增长21.96%

    智通财经APP讯弘宇股份002890002890SZ发布2023年半年度报告报告期内公

  • 深圳中原被拖欠巨额佣金:逾5亿元已启动诉讼追讨,涉恒大、宝能等房企

    8月21日,澎湃新闻从中原集团获悉,近日中原集团发布了一份名为《关于

  • 维多利亚国际集装箱码头扩大起重机船队

    位于墨尔本港的维多利亚国际集装箱码头(VICT)是澳大利亚第一个全自动集

  • 东风新能源 7月份销量数据发布 同比下降8.49%(2023年)

    日前,据众车网行业数据监测显示,东风新能源7月在中国市场的销量达到2

  • 国产电动车将迎巨大威胁:特斯拉Model 3已接受预订

    特斯拉全新Model3即将面世,其外观更加运动化,内饰增设液晶仪表盘,智

  • 埃及供应部长:埃及糖库存足以供应至明年4月份

    【埃及供应部长:埃及糖库存足以供应至明年4月份】!!!今天受到全网的关

  • 打响“金凤泽普”鲜果品牌,新疆泽普有机农产品专场在上海闵行举办

    今天,2023上海援疆消费帮扶——第三届新疆·喀什水果干果节系列之“闵

  • Cruise将把美国旧金山无人驾驶出租车的车队规模砍半加州车管局调查“多起事故”

    【Cruise将把美国旧金山无人驾驶出租车的车队规模砍半加州车管局调查“

  • 旅游
    • 白癜风一般从哪里开始出现 生殖器上能长白癜风吗?

    • 2023WTT卢布尔雅那站:倪夏莲 /德努特3-1巴拉佐娃/马特洛娃,60岁倪夏莲晋级女双决赛

    • 察哈尔学会西南办公室成立|喜马拉雅区域研究中心迁册成都|多国驻蓉总领事出席

    • 操盘手是如何控制股票的?股票操盘手要考什么证书?