手把手实现分布式锁

互斥锁, 自旋锁, 读写锁, 信号量(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效率最高,不完备

 

 

 

posted @ 2022-11-23 17:35  放弃吧  阅读(29)  评论(0编辑  收藏  举报