曹耘豪的博客

分布式锁

  1. 分布式锁实现
    1. 数据库
    2. 单机Redis
      1. 释放时需要Lua脚本保证原子性
    3. ZooKeeper
  2. 一些锁

分布式锁实现

数据库

1
2
3
4
5
update  T t 
set t.status = 'L'
where t.resource_id = '123456'
and t.owner = 'new owner'
and t.status = 'U';

判断数据库返回的修改行数是否等于1,等于1则是抢到了锁,没有抢到返回0

优点:

缺点:

单机Redis

http://redis.cn/topics/distlock.html

1
SET key value NX PX|EX time

TTL设置不能过小,防止主动释放晚于被动过期,可以同时运行一个守护线程续期

释放时需要Lua脚本保证原子性

1
2
3
4
5
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end

ZooKeeper

一些锁

可重入锁:同一个线程可以重复获取的锁,获取N次也需要释放N次

公平锁:按照请求顺序获取锁。优点:线程不会饿死;缺点:吞吐低,CPU唤醒线程开销大

非公平锁:直接尝试获取锁。优点:吞吐高;缺点:线程饿死

读写锁:读锁+写锁。同时只能有一个写者或多个读者

   /