分布式锁

By 江心秋月

分布式锁

线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。

分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。

解决方案

  1. 数据库乐观锁;
  2. 基于Redis的分布式锁;
  3. 基于ZooKeeper的分布式锁。

基于Redis的分布式锁

几个要用到的redis命令:

  • 加锁:setnx(key, value):“set if not exits”,若该key-value不存在,则成功加入缓存并且返回1,否则返回0。

  • 解锁:del(key):删除key

  • get(key):获得key对应的value值,若不存在则返回nil。

  • getset(key, value):先获取key对应的value值,若不存在则返回nil,然后将旧的value更新为新的value。

  • 设置超时:expire(key, seconds):设置key-value的有效期为seconds秒。

存在问题:

  1. setnx和expire的非原子性

  2. del导致误删