写分布式系统的程序员,早晚会遇到这个问题:两个服务同时修改同一份数据,结果数据乱了。
这不是假设场景。电商系统里,两个订单服务同时扣减库存,库存从100变成99,而不是98。支付系统里,两个请求同时处理退款,用户收到两笔退款。这些问题的根源都是一样的:缺少分布式锁。
单机锁好办,std::mutex一把锁搞定。但分布式环境下,进程分散在不同机器上,内存不共享,std::mutex没法用。你需要一个所有进程都能访问的"中央协调者"来管理锁。这就是分布式锁存在的意义。
这篇文章会带你从零开始理解分布式锁。从核心概念讲起,到Redis和etcd两种主流方案的实现原理,再到用现代C++手写一个生产可用的分布式锁库。我会把踩过的坑都讲出来,特别是SETNX那些看起来没问题、实际上要命的陷阱。
文章有点长,建议收藏后慢慢读。
一、分布式锁的核心概念:为什么本地锁不够用?
1.1 从单机锁说起
先回顾一下单机锁。C++11引入了std::mutex,用起来很简单:
#include<mutex>