分布式锁还是锁的范畴,只是在分布式的环境下需要对这个锁重新去实现下来满足锁的需求。
比如在支付系统中,订单从刚创建到最后订单完全落库需要经过很多中间态,每个中间态对于订单的有一些操作,为了保证一个订单被原子化处理,所以会给这个订单加上锁。在分布式系统中,对于订单的操作会在不同的服务上完成,那么按照原来的单机上的锁并不能满足原子化的需求。所以需要使用分布式锁来完成。
现在的系统很多都是集群部署,一个任务分派到一个节点上去执行,那么就不希望被其他节点去执行。这个时候使用分布式锁来锁住被执行的对象,就可以达到预期的效果。
对于分布式场景下问题最后的实现方式我认为可以用一句话概括:
分久必合,合久必分
无论是分布式事务,分布式锁还是其他的技术实现,都是需要一个 分布式xxx的管理者
来实现,比如分布式事务中间件seata
还是有一个事务管理器的角色来管理协调各个节点的事务。
实现分布式锁的方式有很多,主要常用的有以下三种:
- 基于关系型数据库
- 基于Redis
- 基于Zookeeper
分布式锁需求
有实现现有需求。我们需要的分布式锁是一把什么样的锁,他有哪些特点?分布式锁主要应用在分布式系统和集群部署的应用中,他要实现原来单机锁的所有特性,总结下来就是以下几点:
- 高性能,并发性能优秀,高性能的获得和释放
- 高可用,大系统的必备条件,保证运行期间的可用性
- 原子性,锁定对象其中的所有操作必须保证原子性
- 可重入性,这把锁可以被重复去获取
- 失效性,这把锁支持失效机制,防止长时间占用不释放导致死锁
- 非阻塞,获取不到锁可以立马返回,不会阻塞线程
Redis实现分布式锁
Redis
实现分布式锁可以通过k-v来存储锁(创建锁),在处理完业务之后删除这个键即可。
高性能
Redis
自己带了基准测试工具,可以在安装完成之后来进行基准测试。