rdis连接超时问题分析

发现系统后台日志频繁报错redis超时:
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

问题分析:
1.首先根据后台打印的异常堆栈信息找到报错的业务代码位置,发现是redis缓存使用
然后去redsi设置日志存储到文件,方便后续看redis日志

设置redis日志存储到文件在这里插入图片描述
2.再通过查看redis日志发现没有异常信息
3.使用redis客户端Redis Desktop Manager查看慢查询存储的信息
redis慢查询配置(redis2.2.12以上版本)
参考:
https://www.cnblogs.com/yangmingxianshen/p/8070594.html
https://blog.csdn.net/zuihongyan518/article/details/107414060

首先设置阈值(20000微秒):
设置:config set slowlog-log-slower-than 20000
查看:config get slowlog-log-slower-than
再设置存储的列表大小(1000):
设置:config set slowlog-max-len 1000
查看:config get slowlog-max-len
将配置持久化到本地配置文件(如果设置命令带config就自动保存到文件里面了):config rewrite
查看当前慢查询列表大小:slowlog len
使用命令查看慢查询信息:slowlog get [n] 如:slowlog get 128 (返回128个慢查询信息)
清理当前慢查询列表:slowlog reset
在这里插入图片描述
解释
1)表示当前slow log的唯一标识(只会在redis重启后才会被重置)
2)处理完命令后的,Unix时间戳
3)执行命令所需的时间,单位微秒
4)执行的具体命令

PS:4.0后又6个字段,参考网上信息给出解释:
1)第一个字段是每个慢查询唯一标识(每个慢查询实体的ID都是唯一的,而且不会被重新设置,只会在redis重启后才会被重置);
2)处理完命令后的,Unix 时间戳;
3)执行命令所需要的时间,单位微秒;
4)命令的参数列表,是个数组类型;
5)发起请求的客户端IP和端口;
6)客户端的名称(通过client setname client1 设置的客户端的名称)。

3.经过分析代码保存得内容以及使用redis客户端Redis Desktop Manager 分析保存得数据发现可能是大key(指的就是存储的value太大)问题导致

4.关于大key值解决方案有两种:
参考:
https://www.cnblogs.com/xgqfrms/p/13601959.html
https://www.pianshen.com/article/10611533780/
https://www.cnblogs.com/yqzc/p/12425533.html
a.根据存储的结构拆分多个key-value值
b.根据存储的数量拆分多个key-value值

附件:redis 客户端工具
链接:https://pan.baidu.com/s/1mAgAUjuFZDcYNwwCQOmwKw
提取码:2vlh

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐