为什么要加锁
如果多个线程同时访问共享资源时,我们通常需要锁的机制,保证在某个时刻,只有一个线程可以对这个资源进行操作,其他线程需要等待这个锁的释放才能继续处理。主要保证数据一致性
synchronized锁行不行?
在单机应用,可以使用,
但是在分布式系统中,因为是多个机器,不能使用线程级别的jvm锁,只能借助其他中间件来实现分布式锁,
分布式锁的三个属性:
- 互斥性(Mutual Exclusion):同一时刻只有一个客户端持有锁
- 避免死锁(Dead lock free):设置锁的存活时间(Time of Live)ttl
- 容错(Fault tolerance):避免单机故障,锁服务要有一定的容错性
一、SETNX
Redis Setnx (SET IF NOT EXISTS)
命令如下
> SETNX KEY_NAME VALUE
返回结果
如果设置成功(不存在这个key),返回1,如果设置失败(已经存在这个key),返回0
二、SET
> SET KEY VALUE
返回结果
设置成功返回OK
在实现方式上可以使用RedisTemplate的setIfAbsent,
如果不存在(设置成功)返回True,如果存在(设置失败)返回False
三、INCR或INCRBY、INCRBYFLOAT
命令:INCR KEY
> INCRBY KEY INCREMENT
返回结果
如果使用incr,每次自增量为1
返回结果为增量之后的结果
可以通过返回结果是否为1来进行加锁