分布式同步锁问题

本文探讨了从单一部署项目转型至SpringCloud分布式环境时,原有synchronized锁的局限性及解决方案。详细介绍了如何利用Redis的SETNX命令实现分布式锁,避免单点故障,并通过设置超时机制处理异常情况,确保系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在尝试将摸个项目改造为spring cloud分布式的形式时,发现了一个问题,记录其解决方案

问题描述:由于原来的项目都是单一部署的,不存在分布式的形式,所以在同步锁上就简单的使用的synchronized()同步代码块的形式实现的,而由于变成了分布式的方式,synchronized同步代码块的方式就无法做到同一个代码块在不同的分布式机器上的同步效果,因此改为了使用redis的SETNX命令实现同步锁类似效果,顺带一提因为使用了分布式,因此未为了不让redis成为单点故障的项目瓶颈,redis也做了集群和消息同步;

1.1、redis的基本命令

1)SETNX命令(SET if Not eXists)

语法:SETNX key value

功能:当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。

2)expire命令

语法:expire KEY seconds 

功能:设置key的过期时间。如果key已过期,将会被自动删除。

3)DEL命令

语法:DEL key [KEY …]

功能:删除给定的一个或多个 key ,不存在的 key 会被忽略。

 

1.2、实现同步锁原理

1)加锁:“锁”就是一个存储在redis里的key-value对,key是把一组投资操作用字符串来形成唯一标识,value其实并不重要,因为只要这个唯一的key-value存在,就表示这个操作已经上锁。 

2)解锁:既然key-value对存在就表示上锁,那么释放锁就自然是在redis里删除key-value对。 

3)阻塞、非阻塞:阻塞式的实现,若线程发现已经上锁,会在特定时间内轮询锁。非阻塞式的实现,若发现线程已经上锁,则直接返回。

4)处理异常情况:假设当投资操作调用其他平台接口出现等待时,自然没有释放锁,这种情况下加入锁超时机制,用redis的expire命令为key设置超时时长,过了超时时间redis就会将这个key自动删除,即强制释放锁

(此步骤需在JAVA内部设置同样的超时机制,内部超时时长应小于或等于redis超时时长)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值