分布式锁就那点事
分布式场景要求“锁”在某个公共的地方
在单机场景中,为了同步多线程对同一份数据的操作,我们可以利用编程语言自带的工具来构建锁。如,Java 的 synchronized 关键字、ReentrantLock 类等。对于同一服务器上的多个进程,我们可以使用操作系统级别的“锁”来实现同步。如,C# 中以 “Global\” 开头作为 Mutex 的 Name。
在分布式场景中,有多个实例(线程或进程)分布在多个服务器上,我们就需要将“锁”放在这些某个公共的地方,让这些实例都能访问。之前单机场景中,那种只能服务器本地访问的“锁”方案就无法满足这类场景了。
对于使用 “分布式锁” 的客户端来说,它们只关心 “获取锁” 和 “释放锁”。所以 “分布式” 对它们而言,主要指这些客户端是分布在多个服务器上的。
对于实现 “分布式锁” 的服务端来说,“分布式” 往往意味着有多个分布在不同服务器上的实例进行合作,对外提供统一的 “分布式锁” 服务。在客户端眼里,这些服务端实例是一个整体的黑盒;客户端无需了解这些服务实例之间如何协作的细节。