作者:禅与计算机程序设计艺术
1.背景介绍
一、为什么需要分布式锁
互联网公司都在逐渐发展到分布式架构,基于微服务的架构模式正在成为主流。为了提高系统性能和可靠性,很多公司都会选择分布式数据库解决方案,比如Redis、Memcached等。但是同时引入分布式锁也是一个难点,不仅仅是在单机环境下,在分布式环境下如何实现分布式锁就显得尤其重要。
先来看一下分布式锁的作用。举个简单的例子,如果两个线程或者进程要对某个数据进行更新操作(修改、删除),但又不能让他们同时进行,这时候就会用到分布式锁。
假设一个系统中存在多个用户上传文件的功能,当用户A开始上传文件时,可以检查是否已有其他用户正在上传同一份文件。如果有,则不能进行上传;否则,就可以认为可以开始上传了。此时可以设置一个分布式锁,该分布式锁的key可以设置为用户A的身份证号或手机号码,value则设置为当前时间戳,这样就可以让其它用户判断自己是否有上传权限。
二、什么是分布式锁?
分布式锁又称为分布式协调锁,它是一个用来控制分布式环境下某些共享资源访问冲突的方法。通过建立唯一标识(key)的方式来避免资源的竞争,确保资源被多个客户端所独占,从而保证系统的一致性和可用性。一般情况下,分布式锁有两种实现方式,一种是基于数据库实现,另一种是基于消息队列实现。下面我们重点介绍基于数据库的分布式锁。
基于数据库实现的分布式锁可以由数据库系统提供,如MySQL中的乐观锁或悲观锁。基于乐观锁的实现思路比较简单,就是在事务提交前对共享资源做校验,如果检验通过,则完成更新操作;否则,放弃更新操作。基于悲观锁的实