黄东旭解析 TiDB 的核心优势
584
2023-04-19
Redis分布式锁实例分析讲解
1 一人一单并发安全问题
之前一人一单的业务使用的悲观锁,在分布式系统下,是无法生效的。
理想的情况下是这样的:一个线程成功获取互斥锁,并对查询订单并创建订单,其他线程无法干预。它的原理是会有一个锁监视器,来监听是谁获得了锁。
但是问题就出现在:
分布式系统下,有多个不同的JVM,不同的JVM的环境下,锁***是有多个的,就会出现有的线程在别的线程已经拿到锁的情况下,仍然可以获取的到锁。
这个时候,普通的JVM中的锁就已经不管用了,就需要我们利用分布式锁 。
2 分布式锁的原理和实现
2.1 什么是分布式锁
就是可以满足分布式系统或集群模式下多进程可见并且互斥的锁。
它的实现原理就是,不同的JVM环境,都来共用一个锁监视器。这样就不会导致出现多个线程用多把锁的情况了。
特点:
2.2 分布式锁的实现
主要有三种实现方法,我们可以都来进行一个对比。
如下图:
这里主要讲基于Redis的分布式锁的实现 。
实现Reids分布式锁的方法主要就下面两个步骤:
1. 获取锁
获取锁的方法已经是老朋友了,就是使用Redis String类型方法中的setnx方法(互斥性)。但是,为了预防redis服务器宕机的问题,我们要给锁设置一个超时时间,避免出现死锁。(非阻塞)
所以,获取锁的方式可以使用如下代码
SET lock thread1 nx ex 10
lock是锁的key,thread1 是value,nx就是setnx方法,ex就是设置超时时间
2. 释放锁
释放锁就简单了,删除即可。
del lock
代码实现:
需求:定义一个接口,利用Redis实现分布式锁的功能。
代码如下:
接口代码:
?
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。