redis 简单整理——客户端常见异常[十七]
前言
这个还是比较常见的,也就是比较对开发有用的部分。
正文
1.无法从连接池获取到连接
JedisPool中的Jedis对象个数是有限的,默认是8个。这里假设使用的默 认配置,如果有8个Jedis对象被占用,并且没有归还,此时调用者还要从 JedisPool中借用Jedis,就需要进行等待(例如设置了maxWaitMillis>0),如 果在maxWaitMillis时间内仍然无法获取到Jedis对象就会抛出如下异常:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool … Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool. java:449)
还有一种情况,就是设置了blockWhenExhausted=false,那么调用者发现 池子中没有资源时,会立即抛出异常不进行等待,下面的异常就是 blockWhenExhausted=false时的效果:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool … Caused by: java.util.NoSuchElementException: Pool exhausted at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool. java:464)
可能的原因:
客户端:
1. 客户端:高并发下连接池设置过小,出现供不应求,所以会出现上面 的错误,但是正常情况下只要比默认的最大连接数(8个)多一些即可,因 为正常情况下JedisPool以及Jedis的处理效率足够高。
2. 客户端:没有正确使用连接池,比如没有进行释放
3. 客户端:存在慢查询操作,这些慢查询持有的Jedis对象归还速度会比 较慢,造成池子满了。
服务端:
服务端:客户端是正常的,但是Redis服务端由于一些原因造成了客户 端命令执行过程的阻塞,也会使得客户端抛出这种异常。
2.客户端读写超时
造成该异常的原因也有以下几种:
·读写超时间设置得过短。
·命令本身就比较慢。
·客户端与服务端网络不正常。
·Redis自身发生阻塞。
- 客户端连接超时
-1. 连接超时设置得过短
-2. Redis发生阻塞,造成tcp-backlog已满,造成新的连接失败。
-3. 客户端与服务端网络不正常。
- 客户端缓冲区异常
造成这个异常的原因可能有如下几种:
1)输出缓冲区满。例如将普通客户端的输出缓冲区设置为1M,如果使用get命令获取一个bigkey(例如3M),就会出现这个异常。
2)长时间闲置连接被服务端主动断开
- 不正常并发读写:Jedis对象同时被多个线程并发操作,可能会出现 上述异常
5.Lua脚本正在执行
如果Redis当前正在执行Lua脚本,并且超过了lua-time-limit,此时Jedis调用Redis时,会收到下面的异常。
这个时候使用kill script
- Redis正在加载持久化文件
Jedis调用Redis时,如果Redis正在加载持久化文件
- Redis使用的内存超过maxmemory配置
Jedis执行写操作时,如果Redis的使用内存大于maxmemory的设置,会 收到下面的异常,此时应该调整maxmemory并找到造成内存增长的原因
- 客户端连接数过大
如果客户端连接数超过了maxclients,新申请的连接就会出现如下异常
解决方案:
客户端:如果maxclients参数不是很小的话,应用方的客户端连接数基 本不会超过maxclients,通常来看是由于应用方对于Redis客户端使用不当造 成的。此时如果应用方是分布式结构的话,可以通过下线部分应用节点(例 如占用连接较多的节点),使得Redis的连接数先降下来。从而让绝大部分 节点可以正常运行,此时再通过查找程序bug或者调整maxclients进行问题的修复
服务端: 如果此时客户端无法处理,而当前Redis为高可用模式(例如 Redis Sentinel和Redis Cluster),可以考虑将当前Redis做故障转移。
结
下一节redis 常见案例分析。
redis 简单整理——客户端常见异常[十七]的更多相关文章
- 面试简单整理之Redis
179.redis 是什么?都有哪些使用场景? Redis是一个key-value存储系统. 缓存,消息队列,排行榜/计数器,分布式架构,做session共享 180.redis 有哪些功能? 181 ...
- Redis入门很简单之三【常见参数配置】
Redis入门很简单之三[常见参数配置] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存中间件memcached Redis的一下常见设置都是通过对redis.conf ...
- Redis安装和客户端cli常见操作
安装Redis $ wget http://download.redis.io/releases/redis-4.0.6.tar.gz $ tar xzf redis-4.0.6.tar.gz $ c ...
- Redis知识整理
Redis知识整理 转自:https://www.cnblogs.com/rjzheng/p/9096228.html 1.单线程模型 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返 ...
- Redis 知识 整理
简介 安装 启动 注意事项 使用命令 通用命令 数据结构 字符串(string) 哈希(hash) 队列(list) 集合(set) 有序集合(zset) 位图(bitcount) 事务 订阅与发布 ...
- Redis 的几种常见使用方式
常见使用方式 Redis 的几种常见使用方式包括: Redis 单副本 Redis 多副本(主从) Redis Sentinel(哨兵) Redis Cluster Redis 自研 各种使用方式的优 ...
- Java中Redis简单入门
Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. Redis官方网网站是:http://www.redis.io/,如下: Redis ...
- struts2.1.8+hibernate2.5.6+spring3.0(ssh2三大框架)常见异常原因和解决方案
---------------------------------------------------------------------------------------------------- ...
- python的redis简单使用
安装的Python版本 3.6.1 redis安装的2.8 安装redis模块 pip install redis 简单使用 redis-test.py import redis r=redis.Re ...
- Redis具体解释与常见问题解决方式
Redis简单介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对很多其它.包含string(字符串).list(链表).set(集合).zset ...
随机推荐
- Java 四种不同的权限修饰
private 私有属性 只在同一个包下 同一个类中可以调用 同一个包下,不同的类中,可以调用 缺省,保护(protected),公共(public)可以调用, 不同的包下的类中,继承关系,可以调用 ...
- docker 部署prometheus和grafana
prometheus(普罗米修斯):天生为采集存储监控数据而生的时序数据库.prometheus通过各种Exporter采集到监控数据,然后存储进prometheus中,以供查询展示. grafana ...
- 4、 mysql的explain分析执行计划
EXPLAIN或者 DESC命令获取 MySQL如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序. 查询SQL语句的执行计划 : explain sele ...
- Sharding-JDBC源码解析与vivo的定制开发
作者:vivo IT 平台团队 - Xiong Huanxin Sharding-JDBC是在JDBC层提供服务的数据库中间件,在分库分表场景具有广泛应用.本文对Sharding-JDBC的解析.路由 ...
- reciterdoc 资料库 支持中文搜索了。 vuepress-plugin-fulltext-search(用一半)
http://pengchenggang.gitee.io/reciterdoc/ 支持中文搜索了,可是不容易了 通过插件 vuepress-plugin-fulltext-search 实现全文搜索 ...
- bat 执行 窗口jar包
bat 执行 窗口jar包 @echo off start javaw -jar .\yourname.jar exit
- C++实现一个简单的生产者-消费者队列
本文的代码都是ChatGPT生成,我只是做了微小的调整和整合,AI提示词如下: 设计一个C++类,支持生产者-消费者模型,可以通过size函数获取剩余数量 可能第一次生成的不一定合适,多刷新几次. 生 ...
- 麦克风阵列技术-beaforming开源算法源码分析
概述 在音频前端处理算法中,beamforming算法是一个无法绕过的存在,随着AI技术的广泛发展,前端语音技术的需求也在呈现个性化的动态范围.作为一个深耕音频算法多年的老兵,发现站在巨人的肩膀上 ...
- P2602 [ZJOI2010] 数字计数:数位DP
https://www.luogu.com.cn/problem/P2602 // #include <iostream> // #include <iomanip> // # ...
- 使用Wireshark在RTP流中提取中264数据(针对udp)(转)
调试rtsp收发流时,经常会需要抓包以确认是网络问题还是程序问题还是其它问题.通过tcpdump或者wireshark抓到的包通常是rtp流,保存为.pcap格式文件后中,可通过wireshark进行 ...