redis学习笔记4-客户端管理
1.客户端管理
1.1 client list指令
id:客户端连接标识
addr:客户端IP和端口
fd:如果为-1表示是redis内部的伪装客户端
name:客户端名字
1.1.1输入缓冲区:qbuf、qbuf-free
qbuf:输入缓冲区总容量
qbuf-free:输入缓冲区剩余容量
注意:
某个客户端的输入缓冲区超过1G,客户端将会被关闭
输入缓冲区不受redis的maxmemory参数的控制,如果所有客户端输入缓冲区之和加上redis缓存数据大于maxmemory,则可能会产生数据丢失、键值淘汰、OOM等情况
可能出问题的原因:
redis的处理速度跟不上输入缓冲区的增长速度,即并发太大
客户端提交的数据包含大量bigkey,造成输入缓冲区过大
redis发生了阻塞,短期内不能处理命令,需要进行慢查询分析
解决方案:
定期执行client list指令,收集和分析输入缓冲区数据,找到可能出问题的客户端
通过修改连接数和每个客户端连接的输入输出缓冲区大小
总结:在开发中要减少bigkey、减少redis阻塞指令、合理的监控报警
1.1.2 输出缓冲区:obl、oll、omem
obl:固定缓冲区长度
oll:动态缓冲区列表的长度
omem:输出缓冲区使用的字节数
注意:
输出缓冲区可以通过client-output-buffer-limit按照客户端的不同进行配置,客户端分为普通客户端、发布订阅客户端、slave客户端。
client-output-buffer-limit <class> <hard limit> <soft-limit> <soft-seconds>
class:客户端类型
hard limit:如果输出缓冲区大于这个值,客户端将被关闭
oft-limit soft-seconds:客户端输出缓冲区超过oft-limit并且持续了soft-seconds秒后客户端将被关闭
如下为redis默认配置:
client-output-buffer-limit normal 0 0 0 //表示不限制
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
预防方案:
进行监控,设置阈值,超过阈值及时处理
限制普通客户端的输出缓冲区
根据并发情况,适当增大slave的输出缓冲区
限制容易让输出缓冲区增大的命令,如在高并发下的monitor命令
及时监控内存,如果出现内存抖动频繁,可能是输出缓冲区过大
1.1.3 客户端的存活状态:age idle
age:客户端连接上redis到现在一共经历了多少秒
idle:客户端最后一次提交指令到现在空闲了多少秒
注意:
redis默认的最大空闲时间参数为timeout=0,表示连接上来的客户端不管空闲多久都不会被断开,如果设置大于0,则在时间到了后会断开客户端的连接。
解决方案:
redis设置timeout大于0,同时在客户端如jedis中添加空闲检测和连接是否断开的验证措施
1.1.4 客户端类型:flag
1.2 client kill 指令
如client kill 127.0.0.1:52343,手动杀掉某客户端。
1.3 monitor指令
用于监控redis正在执行的指令,如果redis并发量过大,则可能导致monitor客户端的输出缓冲区暴涨,进而影响redis服务。
1.4 其他配置
timeout配置:检测客户端空闲连接超时时间
maxclients配置:客户端最大连接数
tcp-keepalive配置:检测TCP连接活性的周期,建议设置为60,则redis每60秒就会对它创建的TCP连接进行活性检测,防止大量死连接占用系统资源。
1.5 其他指令
1.5.1 info clients
connected_clients:代表当前Redis节点的客户端连接数,需要重点监控,一旦超过maxclients,新的客户端连接将被拒绝。
client_longest_output_list:当前所有输出缓冲区中队列对象个数的最大值。
client_biggest_input_buf:当前所有输入缓冲区中占用的最大容量。
blocked_clients:正在执行阻塞命令(例如blpop、brpop、brpoplpush)的客户端个数。
1.5.2 info stats
·total_connections_received:Redis自启动以来处理的客户端连接数总数。
·rejected_connections:Redis自启动以来拒绝的客户端连接数,需要重点监控。
2. 客户端常见异常
2.1 无法从连接池获取连接
Could not get a resoure from the pool
客户端连接池设置过小,出现供不应求
客户端没有正确使用连接池,比如没有进行释放
客户端存在慢查询,这些慢查询持有的jedis对象归还速度慢,造成连接池满了
redis服务端由于一些原因造成了客户端命令执行过程的阻塞
2.2 客户端读写超时
java.net.SocketTimeoutException: Read timed out
读写超时时间设置过短
命令本身就是慢查询
客户端与服务端网络不正常
redis发生阻塞
2.3 客户端连接超时
java.net.SocketTimeoutException: connect timed out
连接超时时间设置过短
redis发生阻塞,造成tcp-backlog已满,造成新连接失败
网络问题
2.4 客户端缓冲区异常
Unexpected end of stre
输出缓冲区满,如输出缓冲区设置为1m1m60,那么get一个2M的bigkey,就会出现这个异常
长时间闲置连接而被服务器端主动断开
2.5 redis正在加载持久化文件
LOADING Redis is loading the dataset in memory
jedis调用redis时,如果redis正在加载持久化文件时。
2.6 redis使用的内存超过maxmemory
OOM command not allowed when used memory > 'maxmemory'
2.7 客户端连接数过大,超过了maxclients
ERR max number of clients reached
这个问题可能会比较棘手,因为此时无法执行Redis命令进行问题修复,一般来说可以从两个方面进行着手解决:
客户端下线部分应用,在通过查找程序bug或调整maxclients
如果是高可用或集群,服务端考虑将当前redis做故障转移
3. 故障案例
3.1 redis内存陡增
表现:redis主节点内存陡增,几乎用满maxmemory,而从节点很正常,客户端几乎都会产生OOM异常
原因:
需要查询主从节点的键数,如执行dbsize,看是否是主从复制出现问题
是否是输入输出缓冲区造成主节点内存陡增,执行info clients指令
解决方法:
执行client kill指令杀掉输出缓冲区大的连接
禁止开发层面使用如monitor命令,运维层面可以适当使用
限制输出缓冲区的大小
使用专业的redis运维工具,如cachecloud
3.2 客户端周期性的超时
表现:客户端周期性的出现大量超时,而服务端没有明显异常,只是有一些慢查询
定位问题:慢查询和周期性超时时间是否吻合,程序是否定期执行慢查询
解决方案:
运维层面,监控慢查询,一旦超过阈值,就发出警报
开发层面,控制批量查询的个数、时间复杂度高的指令
使用专业的运维工具,如cachecloud
总结:
因为redis是单线程架构模式,因此需要特别注意慢查询和时间复杂度高的指令,这会影响整个redis的并发,可能造成多种问题。
redis学习笔记4-客户端管理相关推荐
- Redis运维和开发学习笔记(7) 内存管理和过期策略
Redis运维和开发学习笔记(7) 内存管理和过期策略 文章目录 Redis运维和开发学习笔记(7) 内存管理和过期策略 内存回收策略 惰性删除 定时任务删除 maxmemory 过期策略allkey ...
- redis学习笔记-持久化
redis学习笔记-持久化 前言 redis持久化有两种方式:RDB和AOF.分别对应着全量复制和增量复制.深刻理解各自的实现方式及适用场景对redis的使用和运维十分重要.下面就分别介绍. RDB持 ...
- Redis学习笔记(五)——持久化及redis.conf配置文件叙述
对于日常使用来说,学习完SpringBoot集成Redis就够我们工作中使用了,但是既然学习了,我们就学习一些Redis的配置及概念,使我们可以更深层次的理解Redis,以及增强我们的面试成功概率,接 ...
- Redis学习笔记1-理论篇
目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...
- Redis学习笔记(实战篇)(自用)
Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...
- Redis(学习笔记)
Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...
- Redis 学习笔记八:集群模式
Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...
- Redis学习笔记②实战篇_黑马点评项目
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...
- Redis学习笔记~Redis在windows环境下的安装
Redis是一个key-value的存储系统,它最大的特点就是可以将数据序列化到文件中. redis存储在服务器的内存或者文件中,它不是session,不是cookies,它只是个更安全,更稳定,更可 ...
- StackExchange.Redis学习笔记(五) 发布和订阅
StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...
最新文章
- 2019微生物组—宏基因组分析专题研讨会
- struts2 通配符简化配置
- 综述丨七场高端报告,带你大视角看人工智能发展
- Swift实现Touch ID验证
- 学习JavaScript 的必备
- R 语言数据读取与存储
- Phone相关进程及通信
- vue 的常用模块安指令(持续记录)
- MySQL innodb_table_stats表不存在的解决方法
- 小学奥数_7832 最接近的分数 python
- 信息学奥赛一本通 1084:幂的末尾 | OpenJudge NOI 小学奥数 7833
- 案例 以继承的方式实现解析频道节目单 c# 1614262275
- 3分钟快速presentation
- sql怎么注销当前登录状态_4种方法教你获取Oracle数据库当前会话/进程的session id...
- 如何用iMazing Profile Editor编辑配置文件
- h5 Table表格
- Excel 函数公式大全
- jacob 插入水印方法整理
- 一篇文章让你学会JWT令牌认证
- 字体图标和变形 transform属性的使用