高并发下的分布式锁

模板网 2021-04-14
public String deductStrck() throws InterruptedException{
    String lockKey = "product_001";    //用作一把分布式锁
    String clientId = UUID.randomUUID().toString();    //记录锁的id,防止别的线程可以解开这把锁

    try{
        //开始锁住
        //设置超时时间目的是为了防止程序突然中断而造成的死锁现象
        //锁的续命操作:时间设置为10,可以再开一个线程每3分钟检查一下看看这把锁是否存在,如果存在将过期时间再延长
        Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,clientId,10,TimeUnit.SECONDS)

        if(!result){
            return error;
        }

        //业务逻辑
        int stock Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
        if(stock>0){
            int realStock = stock-1;
            stringRedisTemplate.opsForValue().set("stock",realStock);
            System.out.println("扣减成功,剩余库存"+realStock);
        }else{
            System.out.println("扣减失败,库存不足");
        }
    }finally{//最终要解开这把锁
        if(clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))){//防止别的线程可以解开这把锁
            stringRedisTemplate.opsForValue().deleted(lockKey);
        }
    }
}

redisson提供完善的分布式锁:https://redisson.org

相关文章

  1. 编程常用词汇表

    这里整理了一些常用词汇,供在编码中使用: 通用 数学 列表 时间 图像 文件目录 执行 业务 用户相关 文章相关 商品相关 优惠券相关 订单相关 这里总结了一些软件开发中常用的词汇,如

  2. 如何应对缓存穿透和缓存雪崩问题

    分析:这两个问题,说句实在话,一般中小型传统软件企业,很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。 缓存穿透,即黑客故意去请求缓存中不存在的数据,导致所有的请

  3. python变量作用域

    在Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。 需要注意的是:在if-elif-else、f

  4. php手动编译fileinfo扩展

    某些同学在执行php composer.phar install时,出现错误 90%可能是漏装了PHP的fileinfo扩展了,用宝塔的请直接在宝塔里安装 下载并解压PHP源码包(内含fileinfo

  5. 虚拟环境-virtualenv

    在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4。所有第三方的包都会被pip安装到Python3的site-packages目录下。 如果我们要同时开发多个应用程序,那

随机推荐

  1. 编程常用词汇表

    这里整理了一些常用词汇,供在编码中使用: 通用 数学 列表 时间 图像 文件目录 执行 业务 用户相关 文章相关 商品相关 优惠券相关 订单相关 这里总结了一些软件开发中常用的词汇,如

  2. 如何应对缓存穿透和缓存雪崩问题

    分析:这两个问题,说句实在话,一般中小型传统软件企业,很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。 缓存穿透,即黑客故意去请求缓存中不存在的数据,导致所有的请

  3. python变量作用域

    在Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。 需要注意的是:在if-elif-else、f

  4. php手动编译fileinfo扩展

    某些同学在执行php composer.phar install时,出现错误 90%可能是漏装了PHP的fileinfo扩展了,用宝塔的请直接在宝塔里安装 下载并解压PHP源码包(内含fileinfo

  5. 虚拟环境-virtualenv

    在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4。所有第三方的包都会被pip安装到Python3的site-packages目录下。 如果我们要同时开发多个应用程序,那