Redis实现分布式锁的几种方式

为什么要加锁

如果多个线程同时访问共享资源时,我们通常需要锁的机制,保证在某个时刻,只有一个线程可以对这个资源进行操作,其他线程需要等待这个锁的释放才能继续处理。主要保证数据一致性
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来进行加锁


posted @ 2022-09-02 18:08  木马不是马  阅读(205)  评论(0编辑  收藏  举报