fbs lock - yaokun123/php-wiki GitHub Wiki

分布式锁

1、mysql(不推荐使用)

select * from table where id=xxx for update;

2、redis

1、最简单的实现

加锁:setnx
释放:del

2、如何避免死锁问题?

setnx + expire 两条命令要保证原子 
> set lock 1 ex 10 nx

3、锁被别人释放怎么办?

释放锁:lua脚本(原子性),先get判断锁是不是属于自己,再del删除锁。

4、锁过期时间不好评估怎么办?

设置过期时间
加入看门狗(守护线程)定时运行,为过期时间续命

可以使用redisson框架

Redlock

为解决单点故障问题,使用最少5台

Redlock的NPC问题
N:Network Delay,网络延迟
P:Process Pause,进程暂停(GC)
C:Clock Drift,时钟飘移

3、Zookeeper

依靠ZK节点类型当中的临时序号节点来实现的

1、争抢锁,只有一个人获得锁(文件系统决定)
2、获得锁的线程出问题(死锁)-> 使用临时节点(会话结束,节点也会消失)
3、获得锁的线程->释放锁
4、锁被释放了,别人怎么知道?
    - 轮训 延迟、压力
    - watch 解决延迟问题,但还是会有压力
    - 临时序号节点 -> 最小的获得锁。watch前一个,成本相对最低。