分布式锁
线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。
分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
解决方案
- 数据库乐观锁;
- 基于Redis的分布式锁;
- 基于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秒。
存在问题:
setnx和expire的非原子性
del导致误删