网站哪个公司做的比较好,wordpress知更鸟主题2019,wordpress仿seowhy基础指南模板,网站如何备案流程需要结合项目中的业务进行回答#xff0c;通常情况下#xff0c;分布式锁使用的场景#xff1a;集群情况下的定时任务、抢单、幂等性场景。
下面先来看一个抢卷场景#xff1a; 以下情况会出现超卖情况#xff1a;
因为线程会交替执行#xff0c;所以线程查询优惠价的数…需要结合项目中的业务进行回答通常情况下分布式锁使用的场景集群情况下的定时任务、抢单、幂等性场景。
下面先来看一个抢卷场景 以下情况会出现超卖情况
因为线程会交替执行所以线程查询优惠价的数据量后线程2又查询优惠券的数据量此时如果优惠券总数是1最后优惠券的数量会变成-1出现超卖。 使用synchronized解决 但在集群的情况下这种方式本地加锁会失效因为synchronized是本地锁这个锁属于JVM每个服务都有各自的JVM它只能解决同一个JVM下线程的互斥 此时需要加分布式锁 redis分布式锁
什么是分布式锁支持分布式集群环境下的锁
基于redis来实现分布式锁底层使用的是setnx和lua脚本。 图1-1
上图中必须设置锁的超时时间否则当服务宕机的时候就不会释放锁了。
redisson实现的分布式锁如何合理控制锁的有效时长
继续看图1-1因为加锁的时候给了一个失效时间假如业务的执行时机太长已经超出了锁的释放时间但此时业务还没有执行完成假如其他线程来获得锁就会获得成功。 出现这种情况后可以给锁续期redisson实现的分布式锁-执行流程
有一个线程线程1过来它获取锁并加锁成功后然后就会去操作redis但加锁成功后会另开一个线程Watch dog监控 持有锁的线程给持有锁的线程 增加锁的持有时间续期。续期的规则为每隔 releaseTime/3(releaseTime是锁的过期时间) 的时间做一次续期默认为10秒。手动释放锁手动释放锁之后需要通知对应线程的Watch dog不需要再监听了 图2-1
假如现在又来了一个新的线程线程2想获取锁它先尝试去加锁如果加锁成功和 图2-1的流程是一样的但如果没有加锁成功呢在redisson实现的分布式锁中它设置了一个while循环来不断的尝试去加锁如果加锁成功了就成功了如果线程1一直没有释放锁线程2有一个阈值只要循环到了阈值线程2就会获取锁失败这种机制会在高并发下大程度增加分布式锁的性能 下图为redisson的使用所有的redisson命令基于lua脚本完成保证脚本执行的原子性
redisson实现的分布式锁是否可以重入
首先分析下图的代码
在add1中尝试获取了锁再去调用add2add又去尝试获取锁此时都是同一个线程可以重入。
回答可以重入判断是否是当前线程通过线程id去判断如果是同一个线程就可重入否则不能 redisson中可重入的实现
使用hash类型来存储锁数据线程的唯一标识和重入次数
每加一次锁重入次数都会1每释放一次锁重入次数-1全部释放完变成0后删除锁信息。 redisson实现的分布式锁可以保证主从一致吗
不能解决但可以使用红锁保证主从一致但性能太低一般项目中用的不多哪有服务器天天挂如果想要保证数据的强一致性就去使用CP思想的zookeeper。