分布式锁实现----Redis
实现原理:setnx
实现逻辑:
1 |
|
Redis 配置类
1 |
|
需要注意的问题:
redis 集群里面的问题
一般redis集群式 一主二从三哨兵如:两个用户买一个东西,库存100,买完应该是98
A用户从主节点获取到锁之后,主节点挂掉了,但是数据没有及时同步到从节点,从节点升级为Master,用户B又会获取到对应的锁,这样A用户和B用户在减库从的时候都是从100 -1 的,所以会出现问题。
可以考虑使用redisson
如果锁没执行到释放,比如业务逻辑执行一半,运维重启服务,或 服务器挂了,没走 finally,怎么办?
加超时事件,超时时间和setnx 应该用一行代码完成,因为两行代码时不具备原子性
锁续期较为麻烦
锁的时间长短比如是10秒,线程1 执行了12s,这个时候锁已经过期了,线程2就会抢占锁资源,当线程1 执行完业务逻辑的时候,释放锁的时候就会把线程2的锁释放掉,这个时候就应该开一个锁续期的线程,比如10s的锁超时时间,可以按照每3s的时间做一次续期操作,但是实际操作中较为复杂,不建议使用
分布式锁实现----Redis
http://yoursite.com/post/3646c2cc.html/