前言:
编程之路的确不易,小女不才,半晌时间,也只理解皮毛。
分布式架构、微服务、并发编程等 心之向往。望不负初心,坚持下去。
以下java代码剪切自诸葛老师。自己稍稍做了下注释,以便更好的理解。
分布式锁,主要解决秒杀高并发下单问题。它与悲观锁和乐观锁大大不同。
不使用redisson的情况:
- 1.首先给商品设置uuid编号,为了防止高并发 锁永久失效问题
锁永久失效解释:
例如:给锁设置有效期为10s,第一个用户抢到锁后,释放锁之前,时间过期了,然后锁自然释放,第二个用户抢到锁,开始执行,等第一个用户执行完之后,到第三步开始释放锁,实际上释放的是用户二的锁,然后用户3进来…如果在高并发的情况下,就形成了锁永久失效问题。
-
2.做异常处理,无论是否抢到锁,或者中途宕机,或者出现死锁情况,finally都要释放锁。而且,释放锁的只能是同一个用户。
-
3.中间会出现死锁的情况:
1.用户一抢到锁之后,在释放锁之前宕机。
2.抢到锁之后,没有设置有效期。
3.抢到锁之后,设置了有效期,但是有效期的时间完全不知道要设置多久才是合适的,所以又设置了超时时间。防止有效期时间太短,自动释放锁。 -
4.释放锁的时候,与之前的uuid做比较,如果确认是同一个用户,则才能删除锁。
所有的优化都结束后,还有一个问题:超时时间你要设置多少合适?怎么解决?
redisson 已经帮我们做好了一切,直接使用就行了。
redisson的原理:提供了两个线程,主线程负责执行任务,另一个线程负责监视超时时间,如果有效期已经到期,查看任务是否完成,如果没有完成,就续命,再续30s。
使用redisson就三步:
1.创建redisson对象
2.上锁,对象.lock(默认锁30s,超时时间也默认30s)这两个参数可不填
3.解锁,对象.unlock()
以下图是redisson锁实现的原理
如果你还不满足,还可以优化,从Redis主从复制出发。
先透漏一点,数据刚入主服务器,服务器出故障…(自行脑补)
哈哈,我的智商就停留在这了,主从太高端,一两句话说不清楚,那就下次分享。