什么场景下需要分布式锁
- 用户下单
锁住uid,防止重复下单。 - 库存扣减
锁住库存,防止超卖。 - 余额扣减
锁住账户,防止并发操作。
分布式系统中共享同一个资源时往往需要分布式锁来保证变更资源一致性。
分布式锁需要具备特性
- 排他性
锁的基本特性,并且只能被第一个持有者持有。 - 防死锁
高并发场景下临界资源一旦发生死锁非常难以排查,通常可以通过设置超时时间到期自动释放锁来规避。 - 可重入
锁持有者支持可重入,防止锁持有者再次重入时锁被超时释放。 - 高性能高可用
锁是代码运行的关键前置节点,一旦不可用则业务直接就报故障了。高并发场景下,高性能高可用是基本要求。
实现Redis锁应先掌握哪些知识点
- set命令
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX
second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。PX
millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。NX
:只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。XX
:只在键已经存在时,才对键进行设置操作。
- Redis.lua脚本
使用redis lua脚本能将一系列命令操作封装成pipline实现整体操作的原子性。
go-zero分布式锁RedisLock源码分析
core/stores/redis/redislock.go
- 加锁流程
1 | lua复制代码--KEYS[1]: 锁key |
- 解锁流程
1 | lua复制代码--释放锁 |
- 源码解析
1 | go复制代码package redis |
关于分布式锁还有哪些实现方案
本文转载自: 掘金