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-客户端管理相关推荐

  1. Redis运维和开发学习笔记(7) 内存管理和过期策略

    Redis运维和开发学习笔记(7) 内存管理和过期策略 文章目录 Redis运维和开发学习笔记(7) 内存管理和过期策略 内存回收策略 惰性删除 定时任务删除 maxmemory 过期策略allkey ...

  2. redis学习笔记-持久化

    redis学习笔记-持久化 前言 redis持久化有两种方式:RDB和AOF.分别对应着全量复制和增量复制.深刻理解各自的实现方式及适用场景对redis的使用和运维十分重要.下面就分别介绍. RDB持 ...

  3. Redis学习笔记(五)——持久化及redis.conf配置文件叙述

    对于日常使用来说,学习完SpringBoot集成Redis就够我们工作中使用了,但是既然学习了,我们就学习一些Redis的配置及概念,使我们可以更深层次的理解Redis,以及增强我们的面试成功概率,接 ...

  4. Redis学习笔记1-理论篇

    目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...

  5. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

  6. Redis(学习笔记)

    Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...

  7. Redis 学习笔记八:集群模式

    Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...

  8. Redis学习笔记②实战篇_黑马点评项目

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  9. Redis学习笔记~Redis在windows环境下的安装

    Redis是一个key-value的存储系统,它最大的特点就是可以将数据序列化到文件中. redis存储在服务器的内存或者文件中,它不是session,不是cookies,它只是个更安全,更稳定,更可 ...

  10. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

最新文章

  1. 2019微生物组—宏基因组分析专题研讨会
  2. struts2 通配符简化配置
  3. 综述丨七场高端报告,带你大视角看人工智能发展
  4. Swift实现Touch ID验证
  5. 学习JavaScript 的必备
  6. R 语言数据读取与存储
  7. Phone相关进程及通信
  8. vue 的常用模块安指令(持续记录)
  9. MySQL innodb_table_stats表不存在的解决方法
  10. 小学奥数_7832 最接近的分数 python
  11. 信息学奥赛一本通 1084:幂的末尾 | OpenJudge NOI 小学奥数 7833
  12. 案例 以继承的方式实现解析频道节目单 c# 1614262275
  13. 3分钟快速presentation
  14. sql怎么注销当前登录状态_4种方法教你获取Oracle数据库当前会话/进程的session id...
  15. 如何用iMazing Profile Editor编辑配置文件
  16. h5 Table表格
  17. Excel 函数公式大全
  18. jacob 插入水印方法整理
  19. 一篇文章让你学会JWT令牌认证
  20. 字体图标和变形 transform属性的使用

热门文章

  1. 宝钢股份:价值洼地,并购预期提振溢价
  2. raw照片处理DxO PureRAW
  3. 关于汽车信息安全,你想了解的知识点都在这里!
  4. 安徽大学计算机考研资料汇总
  5. 史上最详细的UEFI+GTP安装ubuntu18.04LTS全记录,涵盖安装过程中的各种问题,所有的问题都将在这里终结。
  6. 农村小学计算机教育论文,农村中小学信息技术教育的现状分析
  7. 突发情况1-ADM升级报错(195、182、126、76)
  8. Linux下安装nginx详细步骤
  9. flutter中List遍历
  10. 【高德地图】自定义样式: