分布式读写锁 (Distributed Read-Write Lock) 是一种通过将并发读写操作串行化,来保证数据库与缓存之间绝对强一致性的方案。
核心逻辑
利用分布式锁(如 Redisson 的 RReadWriteLock)将读写操作解耦:
- 读锁 (Shared Lock):允许多个线程同时读取,但会阻塞写操作。
- 写锁 (Exclusive Lock):同一时间只允许一个线程写入,且会阻塞所有读操作。
| 操作类型 | 逻辑步骤 | 锁行为 |
|---|---|---|
| 读请求 | 加读锁 → 查缓存/回填 → 释放读锁 | 读读并行,读写互斥 |
| 写请求 | 加写锁 → 更新 DB → 删缓存 → 释放写锁 | 写写互斥,写读互斥 |
sequenceDiagram participant Reader as 读请求 participant Lock as 分布式锁 (Redis) participant Writer as 写请求 Writer->>Lock: 1. 获取写锁 (Exclusive) Note over Writer, Lock: 阻塞后续所有读写 Reader->>Lock: 2. 尝试获取读锁 Lock-->>Reader: 3. 阻塞等待... Writer->>Writer: 4. 更新 DB & 删缓存 Writer->>Lock: 5. 释放写锁 Lock-->>Reader: 6. 获得读锁 Reader->>Reader: 7. 读取数据 Reader->>Lock: 8. 释放读锁
痛点与对策
| 挑战 | 技术对策 |
|---|---|
| 性能损耗 | 仅在对一致性要求极高的核心业务(如余额、库存)使用 |
| 锁超时/死锁 | 必须设置合理的 leaseTime 并配合 try-finally 确保释放 |
| 单点故障 | 使用 Redlock 算法或高可用 Redis 集群(如 Redis Cluster/Sentinel) |