以商品超卖为例讲解Redis分布式锁
本案例主要讲解Redis
实现分布式锁的两种实现方式:Jedis
实现、Redisson
实现。网上关于这方面讲解太多了,Van自认为文笔没他们好,还是用示例代码说明。
一、jedis
实现
该方案只考虑
Redis
单机部署的场景
1.1 加锁
1.1.1 原理
jedis.set(String key, String value, String nxxx, String expx, int time)
key
: 使用key
来当锁,因为key
是唯一的;value
: 我传的是唯一值(UUID
),很多童鞋可能不明白,有key
作为锁不就够了吗,为什么还要用到value
?原因是分布式锁要满足解铃还须系铃人:通过给value
赋值为requestId
,我们就知道这把锁是哪个请求加的了,在解锁的时候要验证value
值,不能误解锁;nxxx
: 这个参数我填的是NX
,意思是SET IF NOT EXIST
,即当key
不存在时,我们进行set
操作;若key
已经存在,则不做任何操作;expx
: 这个参数我传的是PX
,意思是我们要给这个key
加一个过期的设置,具体时间由第五个参数决定;time
: 与第四个参数相呼应,代表key
的过期时间。
1.1.2 小结
set()
加入了NX
参数,可以保证如果已有key
存在,则函数不会调用成功,也就是只有一个客户端能持有锁,满足互斥性;- 其次,由于我们对锁设置了过期时间,即使锁的持有者后续发生崩溃而没有解锁,锁也会因为到了过期时间而自动解锁(即