首页 > 其他分享 >分布式锁

分布式锁

时间:2023-11-19 20:57:09浏览次数:47  
标签:string Rds int key 分布式 cli

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

    private static object lck = new object();
    /// <summary>
    /// 单机锁
    /// </summary>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    [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*10


1000次请求后,再去查库存,发现库存并不为0。所以单机锁,在分布式的情况下,根本没起作用。

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

    /// <summary>
    /// 分布式锁
    /// </summary>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    [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。说明此次的分布式锁是有效的。

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

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

标签:string,Rds,int,key,分布式,cli
From: https://www.cnblogs.com/Leo_wl/p/17842607.html

相关文章

  • Redis之分布式锁
    前言日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。什么是分布式锁方案一:SETNX+EXPIRE方案二:SETNX+value值是(系统时间+过期时间)方案三:使用Lua脚本(包含SETNX+EXPIRE两条指令)方案四:SET的扩展命令(SETEXPX......
  • 分布式核心
    1.CAP理论cap理论是分布式系统的理论基石Consistency(一致性):“allnodesseethesamedataatthesametime”,即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。一致性的问题在并发系统中不可避免,对于客户端来说,一致性指的是并发访......
  • Hadoop学习(一) 搭建伪分布式集群
    文章结构1.准备工作1.1配置IP1.2关闭防火墙1.3修改主机名并与IP绑定1.4创建新用户1.5配置免密匙 2.安装并配置Hadoop伪分布式集群2.1安装Java2.2安装配置Hadoop伪分布式集群 1.准备工作1.1配置IP首先进入该路......
  • Apache Kylin4 分布式的分析型数据仓库
    https://kylin.apache.org/cn/docs/index.htmlApacheKylin4概述欢迎来到ApacheKylin™AnalyticalDataWarehouseforBigDataApacheKylin™是一个开源的、分布式的分析型数据仓库,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBayInc......
  • SignalR 分布式部署
    分布式部署意味着有多台SignalR服务器,一台服务器有多个客户端连接。SignalR要求对于某一个特定连接的所有HTTP请求都需要被一个相同服务进程处理,当SignalR运行在一个服务场时(多个服务器),则必须使用“粘性会话”(服务器开启)或者”跳过协商“(用websocket)问题:某一个客户端给服务器......
  • 分布式事务处理方案大 PK!
    首先先说一个大原则:分布式事务能不用就不要用,毕竟这个用起来还是有一些麻烦的。当然,不用和不会用可是两码事。1.分布式事务基础理论学习分布式事务,有一些基础理论需要我们先来了解下。1.1本地事务本地事务是指将多条语句作为一个整体进行操作的功能,通过数据库事务可以确保该事务......
  • Redisson分布式锁的实现
    分布式锁在多线程环境下,如果多个线程同时访问共享资源(数据库),往往会发生数据竞争。要想在某一线程访问资源时,令其他线程阻塞等待,就需要使用分布式锁,确保共享资源同时只有一个线程访问。实现思路:向Redis中插入同一key:A插入key,如果成功则获取到锁,B再来插入式发现key已经存在了,则......
  • elk分布式日志系统2
    《接着上篇文章elk分布式日志系统1,继续学习》 【Filebeat+Logstash+es】  --------------------------filter不做任何处理,直接输出到logstash----------------------------  1,输出日志到logstash 编辑配置文件filebeat.yml,  关闭output.elasticsearch配置   2,编......
  • 云原生雪花改进型分布式id服务
    1,概述一个基于雪花改进型分布式id基础服务demo地址:http://uid.activeclub.site/web/v1/uuid/get1.1,入参样例:请求路径:GEThttp://{url}:{port}/web/uuid/get入参说明:类目字段名说明url对外暴露的IP或者域名本地启动一般为127.0.0.1或者localhostport对外暴......
  • 【交换机、路由器、双码流、分布式、VKM的基本概念学习】
    分布式节点:分布式就是把传统的音视频设备矩阵切换器、拼接处理器、录播系统、KVM切换器、中央控制系统等这些设备的功能打包成一个等于X功能的节点,然后每个信号输入输出的区域,布置一个这样的X节点,在通过一条网线接到交换机,实现上述的各种功能。可视化:可视化是利用图像传输和处......