为了账号安全,请及时绑定邮箱和手机立即绑定

关于redis分布式锁的问题. 如果没抢到锁,那么应该怎么做,一直重复抢锁的操作吗?

关于redis分布式锁的问题. 如果没抢到锁,那么应该怎么做,一直重复抢锁的操作吗?

智慧大石 2019-08-21 18:21:51
新手初学redis,尝试redis锁的时候,go代码如下:funcmain(){client:=redis.NewClient(&redis.Options{Addr:"localhost:6379",})fori:=0;i
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

看你要实现什么样的锁,或者基于什么样的使用场景,比如说排它锁,redis就实现不了,排它锁在获取不到锁的情况下会阻塞进入等待队列。在其他进程释放锁时会通知该进程再去获取锁,redis不提供这种基于key的通知机制,所以他实现不了排它锁。不过分布式排它锁,可以由Zookeeper实现。
另外一种分布式锁的实现方式是通过乐观锁和自旋的实现方式,就是你说的那种方式,不过一般会设置超时时间,也就是redis设置key的ttl。这样不至于进程一直等待下去。这种锁适应于锁内操作时间比较短,锁竞争不是那么激烈的情况。
你说的那种100个进程抢锁的情况,竞争这么激烈,还是用排它锁比较好。
                            
查看完整回答
反对 回复 2019-08-21
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这个原因充分说明了要项目驱动学习。只有你知道具体的项目的场景,才可以决定自己这个锁怎么处理。比如,你如果抢不到资源就必须等待,而且是同步请求,那么必须等待。比如,你如果可以接受若一致,就可以考虑等待多久锁,然后放弃,记录日志或者其他补偿机制。当然这个就类似于ReentrantLock里面的tryLock和tryLock(longtimeout,TimeUnitunit)的区别
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 466 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信