Redis客户端管理

Redis提供了客户端相关API对其状态进行监控和管理

1.客户端API

1.client list

client list命令能列出与Redis服务端相连的所有客户端连接信息


输出结果的每一行代表一个客户端的信息,可以看到每行包含了十几个 属性,它们是每个客户端的一些执行状态

(1)标识:id、addr、fd、name

这四个属性属于客户端的标识:

·id:客户端连接的唯一标识,这个id是随着Redis的连接自增的,重启 Redis后会重置为0。

·addr:客户端连接的ip和端口。

·fd:socket的文件描述符,与lsof命令结果中的fd是同一个,如果fd=-1 代表当前客户端不是外部客户端,而是Redis内部的伪装客户端。

·name:客户端的名字,后面的client setName和client getName两个命令会对其进行说明。

(2)输入缓冲区:qbuf、qbuf-free

Redis为每个客户端分配了输入缓冲区,它的作用是将客户端发送的命 令临时保存,同时Redis从会输入缓冲区拉取命令并执行,输入缓冲区为客 户端发送命令到Redis执行命令提供了缓冲功能

client list中qbuf和qbuf-free分别代表这个缓冲区的总容量和剩余容量, Redis没有提供相应的配置来规定每个缓冲区的大小,输入缓冲区会根据输入内容大小的不同动态调整,只是要求每个客户端缓冲区的大小不能超过 1G,超过后客户端将被关闭



输入缓冲使用不当会产生两个问题:

·一旦某个客户端的输入缓冲区超过1G,客户端将会被关闭。

·输入缓冲区不受maxmemory控制,假设一个Redis实例设置了 maxmemory为4G,已经存储了2G数据,但是如果此时输入缓冲区使用了 3G,已经超过maxmemory限制,可能会产生数据丢失、键值淘汰


输入缓冲区使用不当造成的危害非常大,那么造成输入 缓冲区过大的原因有哪些?输入缓冲区过大主要是因为Redis的处理速度跟不上输入缓冲区的输入速度,并且每次进入输入缓冲区的命令包含了大量 bigkey,从而造成了输入缓冲区过大的情况。还有一种情况就是Redis发生了阻塞,短期内不能处理命令,造成客户端输入的命令积压在了输入缓冲区,造成了输入缓冲区过大。

监控输入缓冲区异常的方法有两种:

·通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端。

·通过info命令的info clients模块,找到最大的输入缓冲区,例如下面命 令中的其中client_biggest_input_buf代表最大的输入缓冲区,例如可以设置超 过10M就进行报警





(3)输出缓冲区:obl、oll、omem

Redis为每个客户端分配了输出缓冲区,它的作用是保存命令执行的结 果返回给客户端,为Redis和客户端交互返回结果提供缓冲

与输入缓冲区不同的是,输出缓冲区的容量可以通过参数client-outputbuffer-limit来进行设置,并且输出缓冲区做得更加细致,按照客户端的不同 分为三种:普通客户端、发布订阅客户端、slave客户端




对应的配置规则是:

client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>

·<class>:客户端类型,分为三种。a)normal:普通客户端;b) slave:slave客户端,用于复制;c)pubsub:发布订阅客户端。

·<hard limit>:如果客户端使用的输出缓冲区大于<hard limit>,客户端会被立即关闭。

·<soft limit>和<soft seconds>:如果客户端使用的输出缓冲区超过了<soft limit>并且持续了<soft limit>秒,客户端会被立即关闭。

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

和输入缓冲区相同的是,输出缓冲区也不会受到maxmemory的限制

(4)客户端的存活状态

client list中的age和idle分别代表当前客户端已经连接的时间和最近一次的空闲时间


例如上面这条记录代表当期客户端连接Redis的时间为603382秒,其中 空闲了331060秒:

当age等于idle时,说明连接一直处于空闲状态。

(5)客户端的限制maxclients和timeout

Redis提供了maxclients参数来限制最大客户端连接数,一旦连接数超过 maxclients,新的连接将被拒绝。maxclients默认值是10000,可以通过info clients来查询当前Redis的连接数

127.0.0.1:6379> info clients 

# Clients 

connected_clients:1414

可以通过config set maxclients对最大客户端连接数进行动态设置:

127.0.0.1:6379> config get maxclients

127.0.0.1:6379> config set maxclients 50

127.0.0.1:6379> config get maxclients

一般来说maxclients=10000在大部分场景下已经绝对够用,但是某些情 况由于业务方使用不当(例如没有主动关闭连接)可能存在大量idle连接, 无论是从网络连接的成本还是超过maxclients的后果来说都不是什么好事, 因此Redis提供了timeout(单位为秒)参数来限制连接的最大空闲时间,一 旦客户端连接的idle时间超过了timeout,连接将会被关闭

#Redis默认的timeout是0,也就是不会检测客户端的空闲 

127.0.0.1:6379> config set timeout 30

Redis的默认配置给出的timeout=0如果Redis的客户端使用不当或者客户端本身的一些问题,造成没有及时释放客户端连接,可 能会造成大量的idle连接占据着很多连接资源,一旦超过maxclients;后果也 是不堪设想。所在在实际开发和运维中,需要将timeout设置成大于0,例如 可以设置为300秒,同时在客户端使用上添加空闲检测和验证等等措施,例 如JedisPool使用common-pool提供的三个属性:minEvictableIdleTimeMillis、 testWhileIdle、timeBetweenEvictionRunsMillis

(6)客户端类型

client list中的flag是用于标识当前客户端的类型,例如flag=S代表当前客 户端是slave客户端、flag=N代表当前是普通客户端,flag=O代表当前客户端 正在执行monitor命令


client list命令结果的全部属性


client setName和client getName

127.0.0.1:6379> client setName test_client 

OK


如果想直接查看当前客户端的name,可以使用client getName命令,例如下面的操作:

127.0.0.1:6379> client getName

client kill

client kill ip:port

此命令用于杀掉指定IP地址和端口的客户端,例如当前客户端列表为

如果想杀掉127.0.0.1:52343的客户端,可以执行:

127.0.0.1:6379> client kill 127.0.0.1:52343

由于一些原因(例如设置timeout=0时产生的长时间idle的客户端),需 要手动杀掉客户端连接时,可以使用client kill命令

client pause

client pause timeout(毫秒)

client pause命令用于阻塞客户端timeout毫秒数,在此期间客户端连接将被阻塞

·client pause只对普通和发布订阅客户端有效,对于主从复制(从节点内部伪装了一个客户端)是无效的,也就是此期间主从复制是正常进行的,所以此命令可以用来让主从复制保持一致。

·client pause可以用一种可控的方式将客户端连接从一个Redis节点切换 到另一个Redis节点。

需要注意的是在生产环境中,暂停客户端成本非常高。

monitor

monitor命令用于监控Redis正在执行的命令,可以看 到monitor命令能够监听其他客户端正在执行的命令,并记录了详细的时间戳


2.客户端相关配置

·timeout:检测客户端空闲连接的超时时间,一旦idle时间达到了 timeout,客户端将会被关闭,如果设置为0就不进行检测。

·maxclients:客户端最大连接数

·tcp-keepalive:检测TCP连接活性的周期,默认值为0,也就是不进行 检测,如果需要设置,建议为60,那么Redis会每隔60秒对它创建的TCP连接进行活性检测,防止大量死连接占用系统资源。

·tcp-backlog:TCP三次握手后,会将接受的连接放入队列中,tcpbacklog就是队列的大小,它在Redis中的默认值是511。通常来讲这个参数不 需要调整,但是这个参数会受到操作系统的影响,例如在Linux操作系统 中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在Redis启动时会 看到如下日志,并建议将/proc/sys/net/core/somaxconn设置更大


修改方法也非常简单,只需要执行如下命令:

echo 511 > /proc/sys/net/core/somaxconn


3.客户端统计片段

info clients



1)connected_clients:代表当前Redis节点的客户端连接数,需要重点监 控,一旦超过maxclients,新的客户端连接将被拒绝。

2)client_longest_output_list:当前所有输出缓冲区中队列对象个数的最大值。

3)client_biggest_input_buf:当前所有输入缓冲区中占用的最大容量。

4)blocked_clients:正在执行阻塞命令(例如blpop、brpop、 brpoplpush)的客户端个数。

info stats中还包含了两个客户端相关的统计指标


·total_connections_received:Redis自启动以来处理的客户端连接数总数。

·rejected_connections:Redis自启动以来拒绝的客户端连接数,需要重点监控。


4.客户端常见异常

1.无法从连接池获取到连接

2.客户端读写超时

造成该异常的原因也有以下几种:

·读写超时间设置得过短。

·命令本身就比较慢。

·客户端与服务端网络不正常。

·Redis自身发生阻塞。

3.客户端连接超时

4.客户端缓冲区异常

5.Lua脚本正在执行

6.Redis正在加载持久化文件

7.Redis使用的内存超过maxmemory配置

8.客户端连接数过大

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 客户端管理 Redis提供了客户端相关 API对其状态进行监控和管理,本节将深入介绍各个API的使用方法以及开发运...
    linuxzw阅读 684评论 0 3
  • 节选自《redis开发与运维》 先来看一段client list的执行结果 输出结果的每一行代表一个客户端的信息,...
    一帅阅读 11,758评论 1 7
  • 系列 redis数据淘汰原理redis过期数据删除策略redis server事件模型redis cluster ...
    晴天哥_王志阅读 1,043评论 0 1
  • 几款开源的图形化Redis客户端管理软件推荐 摘要: Redis是一个超精简的基于内存的键值对数据库(key-va...
    gurlan阅读 974评论 0 8
  • 本篇就一下方面展开分析 如何使用主从复制? 主从复制的原理(重点是全量复制和部分复制、以及心跳机制) 实际应用中需...
    lucode阅读 988评论 0 5