前言
秒杀是电商平台一个非常重要的功能,在这种高并发的情况下,怎么控制不超库存呢?那就是用锁。但是我们现在都是分布式系统,也就会诞生另外的一个问题。怎么加一个全局的锁,传统的 synchronize 或 lock 锁不行,因为会有多台实例,那么应该加什么锁呢?今天跟着刘雪松老师一起学习一下分布式锁。
Redis 锁原理
借助 setnx 和 expire 两个redis命令完成
setnx:当key不存在,将key设置为value ,存在不做任何操作,返回 0
setnx [key] [value]
setnx lock "123"
expire:设置key 的过期时间
expire [key] [time]
expire lock 10 单位秒
加锁两个条件
- 能加锁
- 形成锁的互斥
问题:setnx是两个命令,如果执行了setnx,expire失败 ,就会造成锁无法释放
解决:
- 使用set key value [Ex seconds][Px milliseconds] [NX|XX]
- 使用 lua 脚本执行,两个命令是个原子操作
setnx lock "123" EX 100 NX
EX seconds 设置失效时长,单位秒
PX milliseconds 设置失效时长,单位毫秒
NX key不存在时设置value
X