redis分布式锁实现方案和原理解析

本文详细解析了Redis分布式锁的实现方案,包括使用`setnx`命令保证线程安全,通过ThreadLocal解决锁的绑定问题,处理重入锁场景,以及业务层面的优化,如使用Semaphore进行线程控制,并介绍异步续命策略防止锁过期。同时,文章提到了在Redis主从架构下可能出现的线程安全问题及解决方案。
摘要由CSDN通过智能技术生成

分布式锁的在分布式集群环境中有着至关重要的作用,为了保证高并发场景下数据的一致性,确保业务能够安全的运行,为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。
首先我们看一段很普通的代码:


    @Autowired
    StringRedisTemplate stringRedisTemplate;
    protected final static  String product = "123456789";

    @RequestMapping("/order")
    public String submitOrder(){
   
            int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
            if(stock>0){
   
                stock = stock -1;
                stringRedisTemplate.opsForValue().set("stock",stock+"");
                System.out.println("扣减库存成功"+stock);
            }else{
   
                System.out.println("失败");
                return "error";
            }
        return "end";
    }

上面的代码想必一看就知道了,就是个简单的扣减库存的操作,从缓存中拿到库存量,然后每次请求去获取到库存进行对应的扣减,但是当我们写完代码之后应该从几个方面做一个思考:
1.代码运行的角度
实际情况下,如果多个请求同时过来,都从缓存中读取数据,能不能正确的扣减库存呢?显然是不能保证,肯定会有线程不安全问题,这里我们采用jemeter进行一个简单的并发测试。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里简单做个测试,在0秒内同时发起5个请求,观察库存扣减是否正确。
结果清晰可见,明显出现数据扣减出错,我们该如何去解决呢?开始分布式锁的引入,首先介绍一个redis的命令
setnx:if not exists key,如果redis中不存在该key的时候才能后设置成功,这样我们就可以利用这个指令去实现锁,第一个线程到了之后,该命令正常执行,redis中多了一对键值对,其他线程来的时候则无法正确设置,也就是无法拿到锁。
我们对上面代码做一个改进,添加锁机制。

 @Autowired
    StringRedisTemplate stringRedisTemplate;
    protected final static  String product = "123456789";

    @RequestMapping
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值