当前位置: 首页 > news >正文

redis面试(十五)公平锁队列重排

队列重拍

先说一下当前的加锁状态

  • 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通信的网络的一个问题,延迟,各种情况都可能会发生

客户端释放锁,释放锁之后队列中的排队的客户端是如何依次获取这把锁的,是按照队列里的顺序去获取锁的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 封装clickHouse线程池与ibeetl解析SQL并对结果转进行转化
  • 监控电脑屏幕被拍照的原理是什么?如此有趣的电脑防偷窥知识,你一学就会!
  • MAC 终端上传文件到云服务器
  • 【银河麒麟高级服务器操作系统】libtirpc-devel 安装问题分析
  • 英国与日本经济数据影响市场走势
  • allegro PCB设计心得笔记(四) -- 显示坐标原点和更改默认产品选项
  • 计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)
  • Qt实现中英文切换中QMessageBox中的中文信息怎么处理
  • uniapp基础知识【搬代码】
  • vue播放flv视频流
  • ASP.NET Core Web API 使用Autofac框架
  • 内网穿透工具Cpolar 食用指南
  • 2024/8/15 不上电测伺服端子是否正常
  • EMC学习笔记2——电磁兼容问题分析
  • 【IMR、TBR、TBDR】【RenderTexture、Cbuffer】学习
  • [译] 怎样写一个基础的编译器
  • 2019年如何成为全栈工程师?
  • Android 架构优化~MVP 架构改造
  • ECS应用管理最佳实践
  • idea + plantuml 画流程图
  • javascript从右向左截取指定位数字符的3种方法
  • laravel 用artisan创建自己的模板
  • MySQL主从复制读写分离及奇怪的问题
  • react-native 安卓真机环境搭建
  • 翻译--Thinking in React
  • 构建工具 - 收藏集 - 掘金
  • 基于web的全景—— Pannellum小试
  • 警报:线上事故之CountDownLatch的威力
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 思否第一天
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (WSI分类)WSI分类文献小综述 2024
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)测试工具
  • (二开)Flink 修改源码拓展 SQL 语法
  • (接口封装)
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (数据结构)顺序表的定义
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .NET业务框架的构建
  • /bin/bash^M: bad interpreter: No such file or directory
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @Transactional 参数详解
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce