本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现、Redisson实现。网上关于这方面讲解太多了,Van自认为文笔没他们好,还是用示例代码说明。

一、jedis 实现

该方案只考虑Redis单机部署的场景

1.1 加锁

1.1.1 原理

jedis.set(String key, String value, String nxxx, String expx, int time)
  1. key: 使用key来当锁,因为key是唯一的;
  2. value: 我传的是唯一值(UUID),很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?原因是分布式锁要满足解铃还须系铃人:通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候要验证value值,不能误解锁;
  3. nxxx: 这个参数我填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作;
  4. expx: 这个参数我传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定;
  5. time: 与第四个参数相呼应,代表key的过期时间。

1.1.2 小结

  • set()加入了NX参数,可以保证如果已有key存在,则函数不会调用成功,也就是只有一个客户端能持有锁,满足互斥性;
  • 其次,由于我们对锁设置了过期时间,即使锁的持有者后续发生崩溃而没有解锁,锁也会因为到了过期时间而自动解锁(即