网页设计旅游网站前言,名表网站,网店出售,室内设计作品集案例队列重拍
先说一下当前的加锁状态
anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部
那么队列重拍就是队列中某个客户端长时间没有重新申请加锁#xff0c;没有刷新分数#xff0c;就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。
总结 …队列重拍
先说一下当前的加锁状态
anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部
那么队列重拍就是队列中某个客户端长时间没有重新申请加锁没有刷新分数就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。
总结
分析代码有些啰嗦所以先总结流程
客户端B长时间没有加锁没有刷新时间分数客户端C加锁刷新之后分数超过了B那就将客户端B的线程从队列中移除客户端 C变成头部客户端B如果再次申请加锁的话会排在C的后面这个就是队列重排
过程
恍恍惚惚的又行进到了10:00:36秒客户端C来进行的重新尝试进行加锁此时客户端B他其实在这之前不知道可能因为网络原因或者是别的什么原因可能他就是没有尝试过重新加锁
进入while true拿到队列第一个元素的timeout时间10:00:30 10:00:36条件成立
zrem redisson_lock_timeout:{anyLock} UUID_02:threadId_02就从有序集合中将客户端B移除了lpop redisson_lock_queue:{anyLock}就从队列中将客户端B也移除了
此时队列的第一个元素是客户端C他的timeout时间是10:00:35 10:00:36条件成立从有序集合以及队列中删除掉客户端C
尝试进行加锁不成立因为客户端A还持有着那把锁
重新排队入队pttl anyLock 23000毫秒 ttl 23000毫秒 timeout 23000毫秒 10:00:36 5000毫秒 10:01:04
zadd和rpush两个指令将客户端C压入队列和有序集合中
假设此时在10:00:38客户端B再次尝试来进行加锁while true退出
尝试加锁不成立
重新尝试入队
ttl 10:01:04 - 10:00:38 26000毫秒 timeout 26000毫秒 10:00:38 5000毫秒 10:01:09
zadd和rpush两个指令重新尝试入队
从这个里面我们可以看到在一个客户端刚刚加锁之后其他的客户端来争抢这把锁刚开始在一定时间范围之内时间不要过长各个客户端是可以按照公平的节奏在队列和有序集合里面进行排序
在一定时间范围内时间不要过长其实队列里的元素顺序是不会改变的各个客户端重新尝试加锁只不过是刷新有序集合中的分数timeout各个客户端的timeout不断加长但是整体顺序大致还是保持一致的
但是如果客户端A持有的锁的时间过长timeout这个所谓的排队是有timeout可能会在while true死循环中将一些等待时间过长的客户端从队列和有序集合中删除一旦删除过后就会发生各个客户端随着自己重新尝试加锁的时间次序重新进行一个队列中的重排也就是排队的顺序可能会发生变化
客户端跟redis通信的网络的一个问题延迟各种情况都可能会发生
客户端释放锁释放锁之后队列中的排队的客户端是如何依次获取这把锁的是按照队列里的顺序去获取锁的