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. Hadoop对Spark:正面比拼报告(架构、性能、成本、安全性和机器学习)
  2. [练习] 用PYTHON来优化网站中的图片
  3. spring boot 异常设计原理
  4. phpcms避免字段值重复
  5. double类型最大值_Java后端精选基础教程:Java 中的基本数据类型「连载 6」
  6. iTerm2 隐藏用户名和主机名
  7. 01 Python变量和数据类型
  8. Java 知识总结大汇总!看完哪个都变大佬!
  9. USACO-Section1.2 Broken Necklace (枚举法)
  10. 后期强蒙版大师破解版
  11. 洛谷【入门4】数组 P2141 [NOIP2014 普及组] 珠心算测验
  12. 在大学里计算机专业总分多少,计算机专业高考多少分录取?附中国计算机专业大学排名及分数线...
  13. 基于CIFAR100的VGG网络结构详解
  14. 看完这篇招聘方法论,90%CEO会心痛
  15. 计算机专业转正定级,大学生毕业一年以后千万别忘了转正定级(转自小志)
  16. 利用Python网络爬虫实现对网易云音乐歌词爬取
  17. 祭奠一位我无比亲爱的亲人的离去
  18. 逻辑回归(logistic regression)原理理解+matlab实现
  19. 计算机多媒体对语文教学的提高,运用多媒体进行语文教学,有效提高学习效率...
  20. HDOJ 1218 Blurred Vision (水题)

热门文章

  1. c语言百日刷题第四天
  2. 工业现场温度的几种检测方法及选型
  3. bilibili怎么用用户名登录_bilibili如何激活账号 哔哩哔哩激活账号的教程
  4. 软件调试实战:windbg 内核调试 (lkd kd )
  5. 2018 Python零基础大神运维自动化就业教程最新版Python运维就业 1-5部分
  6. 指标体系—北极星指标体系
  7. 云计算的未来是XMPP
  8. vue项目中的一些报错解决方法
  9. 国际化与全球化的区别
  10. 通过开发深入解外挂原理【01】