3 回答
TA贡献1802条经验 获得超4个赞
看你要实现什么样的锁,或者基于什么样的使用场景,比如说排它锁
,redis
就实现不了,排它锁
在获取不到锁的情况下会阻塞进入等待队列。在其他进程释放锁时会通知该进程再去获取锁,redis
不提供这种基于key
的通知机制,所以他实现不了排它锁
。不过分布式排它锁
,可以由Zookeeper
实现。
另外一种分布式锁的实现方式是通过乐观锁和自旋的实现方式,就是你说的那种方式,不过一般会设置超时时间,也就是redis
设置key
的ttl
。这样不至于进程一直等待下去。这种锁适应于锁内操作时间比较短,锁竞争不是那么激烈的情况。
你说的那种100个进程抢锁的情况,竞争这么激烈,还是用排它锁比较好。
TA贡献1797条经验 获得超6个赞
这个原因充分说明了要项目驱动学习。
只有你知道具体的项目的场景,才可以决定自己这个锁怎么处理。
比如,你如果抢不到资源就必须等待,而且是同步请求,那么必须等待。
比如,你如果可以接受若一致,就可以考虑等待多久锁,然后放弃,记录日志或者其他补偿机制。
当然这个就类似于 ReentrantLock 里面的 tryLock 和 tryLock(long timeout, TimeUnit unit) 的区别
TA贡献1801条经验 获得超8个赞
需要带锁的操作一遍不会这样的逻辑。。。
比如缓存数据的更新。
1.取到锁的人去查数据库并更新数据
2.未取到锁的要么直接返回空,要么就是要设置二级缓存,把二级缓存的数据返回。。
大家都一直要拿到同一个锁,应该没有这种操作吧?
具体还是要有业务逻辑来进行代码编写,不然没有意义
添加回答
举报