Redis实现分布式锁

该博客介绍了如何使用Redis实现最简单的分布式锁,并通过Redisson库进行优化,以解决库存更新时的并发问题。文章讨论了锁的生命周期、异常处理以及性能优化,包括降低锁粒度,以确保系统的稳定性和效率。
摘要由CSDN通过智能技术生成

最简单的分布式锁

例如在更改商品库存时,我们可以对每个商品加锁
通过setnx实现,只有key不存在时,才可以执行成功

    @GetMapping("/test4")
    public String test4(){
        String lock="lock:product_id";
        String uuid = UUID.randomUUID().toString();
        //设置超时时间为了防止宕机时,来不及释放锁,别的线程抢不到锁,造成死锁
        boolean result=template.opsForValue().setIfAbsent(lock,uuid,10, TimeUnit.SECONDS);
        if(!result){
            return  "error_code";
        }
        //防止出现异常是,来不及释放锁
        try {
            int id_stock=Integer.parseInt(template.opsForValue().get("id_stock"));
            if(id_stock>0){
                template.opsForValue().set("id_stock",""+(id_stock-1));
            }else{
                return "库存不足";
            }
        }finally {
            //加锁和释放锁是同一个
        	if (uuid.equals(template.opsForValue().get(lock))) {
                template.delete(lock);
            }
        }
        return ""+result;
    }

但是仍然存在问题:当在释放锁之前程序已经执行的时间超过了锁寿命,锁已经被释放,此时别的线程就可以抢锁,就会出现问题。

Redisson 分布式锁

需要引入如下依赖

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.6.5</version>
        </dependency>

自定义Redisson

    @Bean
    public Redisson getRedisson(){
        Config config=new Config();
        config.useSingleServer().setAddress("192.168.93.101:6379").setDatabase(0);
        return (Redisson) Redisson.create(config);
    }
    @GetMapping("/test5")
    public String test5() {
        String lock = "lock:product_id";
        RLock redissonLock=redisson.getLock(lock);
        redissonLock.lock();
        try {
            int id_stock = Integer.parseInt(template.opsForValue().get("id_stock"));
            if (id_stock > 0) {
                template.opsForValue().set("id_stock", "" + (id_stock - 1));
            } else {
                return "库存不足";
            }
        } finally {
            redissonLock.unlock();
        }
        return "success";
    }

分布式锁性能优化

粒度
对于不存在并发安全问题的代码,不要给它加锁,不要放在加锁代码块里。尽量降低锁粒度
后续还有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值