关于分布式锁的一些理解

1.业务场景:
在订单支付成功后,需要累加交易金额,交易笔数,项目中采用Redis实现,key:今日日期+商户信息+自定义标示后缀,value:金额与交易笔数

2.问题:
项目是支付系统,在高并发情况下,上述业务场景就会出现问题。当多个订单同时交易成功,多个请求进入到系统中,会出现多个请求,redis中取到相同的限额与限次信息,那么配置信息就会出现错误,从而影响到该块业务

3.解决思路:
解决问题的思路,就是要保证同一时间内,只能有一个请求执行该业务代码,其他的请求则需要等待,因为项目是分布式架构,使用java自带的api无法控制,自然想到分布式锁来解决问题

4.解决方案:
项目中已经引入了redis,redis的命令天生支持分布式锁,所以采用Redis来实现分布式锁,用到的命令:
(1)setnx: 向redis服务器设置值,成功返回1,失败返回0
(2)expire:设置key的失效时间
(3)del:删除redis指定key

5.实现方案:
key: 自定义标识前缀 + 商户信息 value: 随机数
在业务逻辑处理之前,使用redis的setnx命令尝试向redis中设置key
(1)如果返回1,那证明设置key成功,则可以继续往后处理业务,业务处理完之后再删除key
(2)如果返回0,那证明设置key失败,证明有处理中的请求正在执行业务代码,此时需要设置一个重试机制,不断的向redis中设置key,直到返回1,再处理业务,业务处理完之后再删除key
关键的地方:重试机制的设定,保证其他的请求,乖乖的等待处理中的请求处理完成之后,再向下执行,重试的时间根据项目实际情况而定

### 常见分布式锁实现及其工作原理 #### Redis 实现的分布式锁 Redis 是一种高性能的键值存储数据库,其线程模型和原子操作特性使其成为实现分布式锁的理想工具之一。以下是基于 Redis分布式锁的工作原理: 1. **加锁过程** 使用 `SET` 命令设置一个唯一的 key-value 锁标志,并指定超时时间(TTL),防止死锁的发生。如果返回成功,则表示加锁成功;否则说明已有其他客户端持有该锁[^4]。 ```lua SET lock_key unique_value NX PX 30000 ``` 2. **解锁过程** 解锁时需验证当前持有的锁是否属于调用方(即 value 是否匹配)。为了避免误删他人锁的情况,通常会通过 Lua 脚本来完成这一逻辑判断并执行删除操作。 ```lua if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("DEL", KEYS[1]) else return 0 end ``` 3. **可重入支持** 如果需要实现可重入功能,在每次获取到锁后增加计数器记录次数即可。当释放锁时减少对应数量直到零才真正移除锁对象[^5]。 --- #### Zookeeper 实现的分布式锁 Zookeeper 提供了一种可靠的分布式协调服务机制,利用临时顺序节点能够很好地满足互斥访问的需求。下面是它作为分布式锁解决方案的核心思路: 1. **创建路径结构** 所有竞争者都尝试在同一父目录下建立名为 `/lock_prefix_` 开头的 ephemeral sequential znode 。由于这些子节点具有全局唯一性和按序排列的特点,因此可以根据编号大小决定谁拥有优先权去占有资源[^1]。 2. **选举领导者** 当前参与者读取所有兄弟节点列表,并找到最小的那个序列号对应的实例就是实际掌管事务的一方。假如自己正好处于首位位置则意味着获得许可进入临界区。 3. **监听事件通知** 对于非领头羊角色而言,他们应该注册 Watcher 来监视前面紧挨着自己的那个实体状态变化情况。一旦发现目标消失就重新评估自身排名状况看是否有资格晋级为首脑成员。 4. **异常处理能力** 若某台机器崩溃掉线或者网络分区发生分离现象,那么由这个设备所保持的相关 session 将随之失效从而触发相应的清理动作以保障整个系统的正常运转[^3]。 --- ### 总结比较两者特点 | 特性 | Redis 分布式锁 | ZooKeeper 分布式锁 | |-------------------|------------------------------------|-------------------------------------| | 部署复杂度 | 较低 | 较高 | | 数据一致性 | 最终一致 | 强一致 | | 可靠性 | 客户端主动续命避免过早丢失 | 自动管理连接断开后的恢复流程 | | 支持可重入属性 | 需额外编码实现 | 内置天然具备 | 尽管二者都能胜任构建可靠同步屏障的任务,但在不同环境下各有侧重适用领域。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值