高并发下的分布式锁

模板网 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. solr 的Admin界面

    query 1.q(query):定义查询的原始输入字符串。多个条件用AND、OR连接。一定存在在字段前加+号,不存在时在字段前面加-号 ``` company_name:上海有限责任公司 AND

  2. redis的安装配置

    先介绍mac的安装方法 一、安装(首先你要先安装brew工具) brew install redis 然后在终端的末尾你会发现如下: if you don't want/need a backgr

  3. 使用宝塔面板定时任务不执行问题处理

    定时任务不执行 不用宝塔自带的计划任务,因为宝塔自带的计划任务无法以www:www身份去执行任务,会导致面板无法正常写入日志 在vps中输入:crontab -e -uwww ,然后贴上 * * *

  4. php自建邮局下邮件无法正常发送问题解决

    产生问题 自建邮局发邮件时提示错误信息:stream_set_blocking()... 这是因为PHP 5.6+版本强制要求验证服务器的有效性 PHP 5.6+特性 Stream wrappers

  5. 浏览器的同源策略

    一、同源的三个条件 1、域名(二级域名与一级域名之间也算是不同源) 2、端口 3、协议 二、同源策略的意义 浏览器基于用户的隐私安全目的, 防止恶意网站窃取数据(只是浏览器有这个同源策略设置,但是

随机推荐

  1. solr 的Admin界面

    query 1.q(query):定义查询的原始输入字符串。多个条件用AND、OR连接。一定存在在字段前加+号,不存在时在字段前面加-号 ``` company_name:上海有限责任公司 AND

  2. redis的安装配置

    先介绍mac的安装方法 一、安装(首先你要先安装brew工具) brew install redis 然后在终端的末尾你会发现如下: if you don't want/need a backgr

  3. 使用宝塔面板定时任务不执行问题处理

    定时任务不执行 不用宝塔自带的计划任务,因为宝塔自带的计划任务无法以www:www身份去执行任务,会导致面板无法正常写入日志 在vps中输入:crontab -e -uwww ,然后贴上 * * *

  4. php自建邮局下邮件无法正常发送问题解决

    产生问题 自建邮局发邮件时提示错误信息:stream_set_blocking()... 这是因为PHP 5.6+版本强制要求验证服务器的有效性 PHP 5.6+特性 Stream wrappers

  5. 浏览器的同源策略

    一、同源的三个条件 1、域名(二级域名与一级域名之间也算是不同源) 2、端口 3、协议 二、同源策略的意义 浏览器基于用户的隐私安全目的, 防止恶意网站窃取数据(只是浏览器有这个同源策略设置,但是