redis链接阻塞,导致程序没有响应

news2024/10/6 10:31:05

目录

    • 一、场景
    • 二、原因
    • 三、排查
      • 1、使用 `info client` 命令查看redis链接统计情况
      • 2、使用 `client list` 命令查看redis链接信息
      • 3、关闭程序,看阻塞的链接是否有所减少
      • 4、排查使用 `blpop` 命令的相关代码
    • 四、解决


一、场景

1、程序在运行一段时间后,会出现没有响应的情况

2、没有报错

3、websocket消息接收正常

4、http请求正常


二、原因

经过排查,发现是redis链接阻塞导致


三、排查

1、使用 info client 命令查看redis链接统计情况

发现阻塞的链接数有132个

在这里插入图片描述


2、使用 client list 命令查看redis链接信息

数据太多,这里只贴一部分

在这里插入图片描述

将内容复制到文本工具,找一下程序所在的服务器是否有阻塞的redis链接

搜索关键字:flags=b

client list 命令详解:http://t.csdn.cn/2MWxo

在这里插入图片描述


3、关闭程序,看阻塞的链接是否有所减少

当时忘记截图了,这里使用文字描述

在这里插入图片描述

补充:该程序配置的redis链接数正好是6个,与程序关闭后减少的阻塞的链接数一致

至此,可以确认

1、程序所在服务器确实有链接阻塞

2、使链接阻塞的命令是blpop


4、排查使用 blpop 命令的相关代码

最终发现如下代码

@Override
public void run() {
    String key = "redisKey_xxx_xxx_test";
    // 死循环
    while (true) {
        try {
        	// 封装的工具类,这里指定的阻塞时间为:0L,永久阻塞,问题就在这里
			Object o = redisUtil.listPop(key, 0L, TimeUnit.SECONDS);
			if (o != null) {
				......
			}
        } catch (Exception e) {
            logger.error("线程执行出现异常!详情:" + e.getMessage(), e);
        }
    }
}

四、解决

调整线程执行逻辑,使redis链接阻塞时间减少

@Override
public void run() {
    String key = "redisKey_xxx_xxx_test";
    while (true) {
        try {
        	// 获取队列长度,只有队列存在数据才往下走
            if (redisUtil.listGetListSize(key) > 0) {
            	// 封装的工具类,指定阻塞时间为:10秒
                Object o = redisUtil.listPop(key, 10L, TimeUnit.SECONDS);
                if (o != null) {
                    ......
                }
            } else {
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            logger.error("线程执行出现异常!详情:" + e.getMessage(), e);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式】分布式ID

目录 前言一、雪花算法snowflake1. 组成2. 优缺点3. 时钟回拨怎么解决a. 时钟回拨b. 解决方案 4. 项目中如何使用 二、基于Redis三、基于Zookeeper四、号段模式五、指定步长的自增ID六、UUID参考 六、扩展总结 前言 分布式场景下,一张表可能分散到多个数据结点上。因…

【数据结构】C++实现二叉搜索树

二叉搜索树的概念 二叉搜索树又称为二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。若它的右子树不为空,则右子树上所有结点的值都大于根结…

问道管理:注册制对涨幅的限制?

注册制作为中国证券商场变革的重中之重,其本质是将发行商场转移到审阅商场,实现商场准入的有效管控。与此同时,注册制关于股票商场的涨幅也有必定的约束。 首先,注册制能够经过严厉的审阅来制约公司发行股票的数量和节奏。传统IP…

Linux 多线程( 进程VS线程 | 线程控制 )

文章目录 Linux进程 VS 线程进程的多个线程共享 进程和线程的关系线程创建 pthread_create获取线程ID pthread_self线程等待 pthread_join终止线程进程分离线程ID及进程地址空间布局 Linux进程 VS 线程 进程是资源分配的基本单位。线程是OS调度的基本单位。 线程共享进程数据…

Michael.W基于Foundry精读Openzeppelin第34期——MerkleProof.sol

Michael.W基于Foundry精读Openzeppelin第34期——MerkleProof.sol 0. 版本0.1 MerkleProof.sol 1. 目标合约2. 代码精读2.1 processProof(bytes32[] memory proof, bytes32 leaf) && processProofCalldata(bytes32[] calldata proof, bytes32 leaf)2.2 verify(bytes32[…

图像处理之频域滤波DFT

摘要:傅里叶变换可以将任何满足相应数学条件的信号转换为不同系数的简单正弦和余弦函数的和。图像信号也是一种信号,只不过是二维离散信号,通过傅里叶变换对图像进行变换可以图像存空域转换为频域进行更多的处理。本文主要简要描述傅里叶变换…

Heap及其应用

目录 堆的相关知识 什么是堆? 堆的性质: 堆的实现: 堆的结构: (一)堆的插入 向上调整法: 寻找父节点 循环结束条件 代码: (二)堆的删除 删除根节点…

Huggingface:免费开源AI人工智能API工具平台

| 【产品介绍】 • 名称 Huggingface • 成立/上线时间 2016年 • 具体描述 HuggingFace是一个开源的自然语言处理AI工具平台,它为NLP的开发者和研究者提供了一个简单、快速、高效、可靠的解决方案,让NLP变得更加简…

R绘制箱线图

代码大部分来自boxplot()函数的帮助文件,可以通过阅读帮助文件,调整代码中相应参数看下效果,进而可以理解相应的作用,帮助快速掌握barplot()函数的用法。 语法 Usage(来自帮助文件) barplot(height, ...)## Default S3 method: …

lua环境搭建数据类型

lua作为一门计算机语言,从语法角度个人感觉还是挺简洁的接下来我们从0开始学习lua语言。 1.首先我们需要下载lua开发工具包 在这里我们使用的工具是luadist 下载链接为:https://luadist.org/repository/下载后的压缩包解压后就能用。 2.接下来就是老生…

听GPT 讲Istio源代码--istioctl

在 Istio 项目的 istioctl 目录中,有一些子目录,每个目录都有不同的作用和功能。以下是这些子目录的详细介绍: /pkg: pkg 目录包含了 istioctl 工具的核心代码和库。这些代码和库提供了与 Istio 控制平面交互的功能,例如获取和修改…

postgresql 内核源码分析 btree索引插入分析,索引页面分裂流程,多举措进行并发优化,对异常进行保护处理

Btree索引插入流程分析 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&a…

Swing程序设计详解(一)

【今日】 “若你决定灿烂,山无遮,海无拦” 目录 初识Swing 一 Swing简述 二 Swing常用窗体 2.1 JFrame窗体 2.2 JDialog对话框 2.3JOptionPane小型对话框 (1)通知框 (2)确认框 (3)输入框 (4)自定义对话框 三 常用布局管理器 3.1 绝…

JWT生成与解析/JWT令牌前端存储

第一步&#xff1a;创建项目 添加Maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.s…

【C++】深拷贝和浅拷贝 ② ( 默认拷贝构造函数是浅拷贝 | 代码示例 - 浅拷贝造成的问题 )

文章目录 一、默认拷贝构造函数是浅拷贝1、默认拷贝构造函数2、默认拷贝构造函数是浅拷贝机制 二、代码示例 - 浅拷贝造成的问题 一、默认拷贝构造函数是浅拷贝 1、默认拷贝构造函数 如果 C 类中 没有定义拷贝构造函数 , C 编译器会自动为该类提供一个 " 默认的拷贝构造函…

GeoJSON转STL:地形3D打印

我们通过将 GeoJSON 形状坐标提取到点云中并使用 Open3d 应用泊松重建&#xff0c;从 GeoJSON 数据重建 STL 网格。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 我对打印 GeoJSON 山丘的第一次尝试深感不满&#xff0c;因此想出了一个三步流程&#xff0c;仅使用开源…

Acwing 828. 模拟栈

Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈&#xff1a;先进后出 队列&#xff1a;先进先出 代码展示 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while (m -- ){string o…

【JVM】经典垃圾收集器

文章目录 说明新生代收集器Serial收集器ParNew收集器Parallel Scavenge收集器 老年代收集器Serial Old收集器Parallel Old收集器CMS收集器 Garbage First收集器需要解决的问题运作过程CMS和G1的区别 说明 Java中有许多垃圾收集器&#xff08;Garbage Collector&#xff0c;GC&…

Spring Cloud Alibaba系列之nacos:(5)源码本地环境搭建

传送门 Spring Cloud Alibaba系列之nacos&#xff1a;(1)安装 Spring Cloud Alibaba系列之nacos&#xff1a;(2)单机模式支持mysql Spring Cloud Alibaba系列之nacos&#xff1a;(3)服务注册发现 Spring Cloud Alibaba系列之nacos&#xff1a;(4)配置管理 为什么要搭建本地…

范文展示,如何三步写出一篇满意的论文

第一步&#xff1a;输入文章关键信息 文章标题&#xff0c;写论文的话即为拟定的论文标题&#xff0c;例如这篇范文中的题目为“阳明心学研究” 关键词&#xff0c;可以写出多个论文主题相关的关键词&#xff0c;用逗号分开&#xff0c;例如这篇范文中只写了一个关键词“王阳…