手把手实现分布式锁
互斥锁, 自旋锁, 读写锁, 信号量(sem_init, sem_post, sem_wait), 条件变量,
sem_init第二个参数pshared,如果大于0,用于多进程,如果为0,是在多线程
原子变量, 内存屏障
信号量可以用来多级缓存,多进程的通信(IPC通信)
IPC通信:pipe,FIFO, 信号量, 信号, 消息队列,共享内存,socket
分布式锁的条件
1.分布式锁是一个资源,需要网络交互
2.行为 加锁和解锁
3.加锁和解锁的对象必须是同一个
4.锁超时,防止长期没有释放锁
5.容错性,假如服务宕机,此时还没有备份(异步返回),就会产生错误,一致性来解决
redlock:开多个数据库进程,不是集群都是主节点,加锁或解锁成功半数以上算成功
mysql的加锁只能轮询,如果加锁失败,轮询加锁
超进程是什么:定时检测这张表,拿当前时间减去update_time,如果超过最大持锁时间,删除那一行(释放锁)
重入锁:需要加一个字段count
redis同步数据是采用的异步复制(主从复制)的方式,可能会产生错误,主节点宕机,备份失败。解决:raft一致性,半数以上
redis加锁:
set act_lock 454654 NX PX 1000
NX 表示如果不存在就设置, PX设置过期时间, PX表示毫秒, EX表示秒
mysql效率最差,最不完备
redis效率最高,不完备