【架构】2.6 分布式锁

0.问题与链接

进程使用互斥锁,进程挂掉,如何释放锁?

三种实现分布式锁的方式

【分布式锁】三种分布式锁的实现【原创】

1.锁的知识回顾

1. 线程锁
2. 进程锁(nginx 中 accept 锁-共享内存+信号量)
3. 分布式锁(在不同机器的进程的锁)

2.现有的提供的分布式锁的解决方案的开源项目

1.redis
2.mysql
3.zookeeper

3.分布式锁需要考虑的因素及特征

1.互斥性
2.可重入性,一个进程允许递归获取锁,当然也需要递归释放锁
3.对于锁超时的处理(比如说如果进程挂了,会导致锁超时,需要考虑释放分布式锁)
4.高效高可用
5.在公平和非公平之间权衡,如果按获取锁的时间进行就是公平的,否则就是非公平的.

4.一些概念和小知识

(1)随机执行-非公平
(2)顺序执行-公平
(3)最终一致性(redis)
(4)强一致性(zookeeper)
(5)最终一致性-各台机器上的数据满足最后一样即可
(6)强一致性-各台机器上的数据满足一直一样
(7)Redis的主从复制中,主机写操作的时候,会通知从属机器进行写操作,实现最终一致性(在rdb模式下,会有1秒【配置文件决定】的操作丢失,
在aof模式下,会有一个操作丢失).
(8)Zookeeper用的是zab协议,是强一致性.
(9)多核编程考虑:隔离性(运行环境的隔离)和统一性(数据的统一)
(10)分布式中考虑: 一致性,可用性,分区容错性.(CAP,三者满足俩).
(11)CAP:Consistency(一致性), Availability(可用性),Partition tolerance(分区容错性).
(12)操作redis,实际上是执行redis提供的rpc调用来对redis中的数据结构.zk的数据请求方式是:
"请求回应+监听发布"来实现所有的功能.按照请求顺序来执行命令,返回也是按照执行的顺序来的.
skynet利用协程实现同步非阻塞的方式.
(13)当一个线程操作执行到设置的时间的时候还没有执行完,就要进行续时间;
(14)redis中,释放分布式锁的时候,当有多个操作的时候,如果需要原子完成,一般这样操作:
    if(get(key)==四元组){delete(key)}这个要作为一个lua事务来执行.
(15)redis实现的分布式锁是悲观锁,用setnx()来实现.或者进阶版本的redlock来实现.
(16)悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次
在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了
很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
(17)乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以
不会上锁,期间该数据可以随便被其他人读取,但是在更新的时候会判断一下在此期间别人有没有去更新这
个数据,可以使用版本号等机制.

猜你喜欢

转载自blog.csdn.net/Edidaughter/article/details/115261847
今日推荐