转载自:https://my.oschina.net/heweipo/blog/1536679

1、客户端通信协议

1)客户端与服务端之间的同学协议是在TCP协议之上构建的;

2)Redis定制了RESP(Redis Serialization Protocol ,Redis 序列化协议)实现客户端与服务端的正常交互。正因为这种协议简单而又容易理解,所以很多编程语言的客户端就容易实现了,比如 Java的客户端 Jedis.

2、客户端Jedis的使用

生产环境一般我们不会使用直连的方式(因为连接没法管理,导致资源不可控),而是使用连接池,使用 Jedis 连接池时主要注意一下几个方面。

1)maxActive:最大连接数,默认8个,生产环境一般配置16个差不多,(主要是Jedis处理高效)

2)maxIdle:池子里的最大空闲连接数,默认8个,意思是没有客户端来连接时池里最多闲置 8 个

3)minIdle:池子里的最小空闲连接数,默认0,意思是没有客户端来连接时池里最少闲置数

4)jmxEnabled:是否开启jmx监控,默认为 true,可以通过 jconsole 等工具监控连接池

5)minEvictableIdleTimeMillis:连接最小空闲时间,默认30分钟,达到这个值后空闲连接被移除

6)numTestsPerEvictionRun:做空闲连接检测时每次采样数,默认 3

7)TestOnBorrow:向连接池借用连接时是否做连接的有效性检测(Ping),默认false,如果设置为true,那么每次借用时都会多一次 ping,不过增强了代码的健壮性,其实如果是在Redis服务端配置了 timeout ,那么这个操作我觉得是很有必要的,因为服务端会把你这边的连接给移除。

8)testOnReturn:同上,不过这里是归还时,默认为false。

9)testWhileIdle:对连接池的连接时是否做空闲检测,默认为 false

10)timeBetweenEvicationRunsMillis:空闲连接检测周期,单位为毫秒,默认 -1 ,不做检测

11)blockWhenExhausted:当连接池用尽后,新的调用者是否要等待空闲连接,这个参数和下面的maxWaitMillis 对应的,只有当 blockWhenExhausted = true 时 maxWaitMillis 才会生效。默认为 true。

12)maxWaitMillis:当连接池资源用尽后,新的调用者来等待空闲连接时的最大时间,单位毫秒,默认 -1 ,表示永不超时,这个很要命的,一定要改掉。

3、客户端管理

1)查看客户端连接情况

>info clients

# Clients

connected_clients:2 // 当前连接数,这个暴增,说明连接池没有配置得当

client_longest_output_list:0 // 输出缓冲区列表最大对象数,其实就是最大 oll

client_biggest_input_buf:0 // 最大输入缓冲区,单位字节,其实就是最大 qbuf

blocked_clients:0 // 正在阻塞阻塞命令(比如 blpop brpop 等)的客户端个数

2)查看服务端连接汇总

> info stats

# Stats

total_connections_received:6 // 从启动到现在连接的总数(并不是当前连接数)

rejected_connections:0 // 从启动到现在拒绝的连接数

3)查看客户端连接的详细信息

>client list

id=5 addr=127.0.0.1:52821 fd=8 name= age=115 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

id=6 addr=127.0.0.1:52822 fd=9 name= age=91 idle=10 flags=O db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=monitor

id:唯一标识

name:客户端名称,通过 client setName client1 和 client getName 来设置获取名称

addr : 客户端的地址和端口,当想停止该客户端时则可以通过这个值 kill 掉

fd : 套接字所使用的文件描述符,Linux 里的 socket 句柄

age : 以秒计算的已连接时长,表示 client 从连接到现在的时长,所以叫做年龄

idle : 以秒计算的空闲时长,表示当前距离上一次执行命令的空闲时长

flags : 客户端 flag,标识客户端的信息,比如主从服务,事务执行情况等

db : 该客户端正在使用的数据库 ID

sub : 已订阅频道的数量

psub : 已订阅模式的数量

multi : 在事务中被执行的命令数量,如果没有使用事务就是 -1,记住是命令个数,包括读写

qbuf : 查询缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区)

qbuf-free : 查询缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)

obl : 输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)

oll : 输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)

omem : 输出缓冲区和输出列表占用的内存总量

events : 文件描述符事件,w 可写, r 可读

cmd : 最近一次执行的命令

注意:

A:输入缓冲区 qbuf 和 qbuf-free 以及 client_biggest_input_buf

Redis为每个客户端分配了输入缓冲区,它的作用是将客户端发送的命令临时保存,同时Redis会从输入缓冲区拉取命令并执行。其中 qbuf 代表这个缓冲区的总容量,qbuf-free 代表剩余容量。

Redis并没有提供相应的配置来规定每个缓冲区的大小,输入缓冲区会根据输入的内容大小的不同动态调整,只是要求每个客户端缓冲区的大小不能超过1G,超过后客户端将被关闭;另外如果没有达到 1 G,但是和当前Redis的空间加起来已经超过 MaxMemory 时,也可能出现 OOM,这个时候命令可能会被丢失。

其实生产环境很少有因为输入缓冲区导致的阻塞,主要还是因为命令过多积累在执行队列中,因此我们可以通过 qbuf 预测出这个连接有多少命令被发送,如果真的 qbuf 非常大,那么命令太多,可能会导致阻塞,比如管道、事务命令等。当然也有可能服务端发生阻塞导致客户端的命令一直被积压,也有可能客户端执行了大对象。

B:输出缓冲区 obl 和 oll 以及 client_longest_output_list

Redis为每个客户端分配了输出缓冲区,它的作用是保存命令执行的结果返回给客户端,其实就是为命令返回结果提供临时缓冲区。

与输入缓冲区不同的是,输出缓冲区的大小可以通过 client-output-buffer-limit 来进行设置。

输出缓冲区有两部分组成,固定缓冲区(obl)和动态缓冲区(oll),固定缓冲区只有 16KB,也就是返回值大于 16KB时,就会动用固定缓冲区,两种计算方式不一样哦,固定缓冲区是用字节单位,动态缓冲区使用 对象个数。另外 omem 是指动态缓冲区+固定缓冲区的总字节数。

生产环境遇到的问题在输出缓冲区还是比较多的,比如大对象的获取,就会造成 oll 占用过大,从而导致阻塞,所以最好是限制住 client-output-buffer-limit ,然后报警提示。

4)设置最大连接数 maxClients

> config get maxClients

1) "maxclients"

2) "10000"

> config set maxClients 500

OK

// 最大连接数 10000,然而 Jedis的连接数默认是 8 ,对比一下差距好大啊,不知道这里如何设置的,是不是考虑到集群等因素。

5)设置检测客户空闲时间

> config get timeout

1) "timeout"

2) "30"

> config get timeout

1) "timeout"

2) "45"

// 如果client的idle得到了45,那么这个连接就会被kill掉,所以使用连接池时最好对连接进行可用性检测,同时也要避免客户端在一个连接内消耗大量的时间。

6)client setName | getName

> client setName client1

OK

> client getName

"client1"

// 给客户端指定一个自定义名字,方便查找。 我们可以在 client list 找到。

或者执行 > redis-cli client list | grep client1

7)client kill addr

>client kill 127.0.0.1:52875

>OK

8)client pause timeout(毫秒)

>client pause 1000

// 阻塞客户端 1000 毫秒,要知道Redis是单线程的,如果这个客户端阻塞,那么其他客户端全部都要等待他执行完成,所以一切客户端导致的延迟阻塞,都会是服务端的延迟阻塞。

9)monitor 监控其他客户端的命令执行

> monitor

OK

1503724607.774500 [0 127.0.0.1:52880] "get" "str"

1503724610.339557 [0 127.0.0.1:52880] "set" "str" "hll"

// 在寻找问题时这个命令很管用,但是高并发下,这个命令很致命的,因为大量输出导致该客户端的输出缓冲区被占满,从阻塞输出。所以用过后尽早关闭。

第一个是执行命令的时间戳,可以使用 new Date(1503724607.774*1000)

第二个时数据库索引 0

第三个是执行的命令以及命令的参数 "get" "str"

10)客户端的其他配置

1)timeout :指Redis的连接如果空闲时间超过timeout则断开,可以通过 client list 查看连接

2)maxClients:这个和下面的 tcp 连接数不是一码事,这个指的是客户端数。

3)tcp-keepalive:检测TCP连接的活性周期,默认为 0 ,不检测。这个最好是配置一个 60 秒,因为大量的死连接会占用服务端的TCP资源。

4)tcp-backlog:TCP 三次握手成功后,会把这个连接放入队列中,这个队列的最大长度就是 tcp-backlog 的配置,默认是 511 , 通常这个参数不用调整。但是有些Linux系统的这个值配置时 128,则需要对应调整为 511.

如下查看和设置

> cat /proc/sys/net/core/somaxconn

128

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

> cat /proc/sys/net/core/somaxconn

511

Redis 客户端使用与监控相关推荐

  1. Redis实现分布式锁全局锁—Redis客户端Redisson中分布式锁RLock实现

    2019独角兽企业重金招聘Python工程师标准>>> 1. 前因 以前实现过一个Redis实现的全局锁, 虽然能用, 但是感觉很不完善, 不可重入, 参数太多等等. 最近看到了一个 ...

  2. 阿里云专访Redisson作者Rui Gu:构建开源企业级Redis客户端之路

    摘要: 本文为阿里云同学在RedisConf2018上对Redisson开源客户端作者Rui Gu做的一个专访,主要介绍了Rui Gu参与开启Redisson客户端开发的历程,同时也详细介绍了Redi ...

  3. linux redis客户端_你见过能把Redis的主从复制讲这么明白的吗?

    概念 1.Conception(概念) Redis的复制也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 ...

  4. Redis 压力测试 服务监控

    Redis 压力测试 & 服务监控 Redis 压力测试 Redis 安装成功后,会在 /usr/local/bin/目录下生成redis-benchmark压测工具.该工具模拟N个客户端同时 ...

  5. 找不到合适好用的redis客户端工具?试试官方的客户端工具RedisInsight

    这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发.拒绝营销号,拒绝标题党 背景 之前使用的redis客户端工具是AnotherRedisDesktopManager Anoth ...

  6. REDIS 客户端封装 SPARROW 框架源码

    redis 本身有客户端,先抛出来一个问题?为什么要对redis客户端进行二次封装? 大概在11年时侯,第一次接触redis,那时侯研究过redis的各种数据结构,直接拿redis的客户端jedis直 ...

  7. Redis连接命令,Redis安全策略,Redis客户端(client)命令,Redis服务器命令

    目录 Redis连接命令详解 Redis连接命令 连接命令应用 Redis安全策略 命令配置密码 手动配置密码 指令安全 端口安全 SSH代理 Redis客户端(client)命令 Redis IO多 ...

  8. redis android客户端,Redis客户端GUI工具(RedisClient)

    RedisClient是Redis客户端GUI工具,使用Java swt和jedis编写.它将redis数据以windows资源管理器的界面风格呈现给用户. Redis 是一个高性能的key-valu ...

  9. 功能强大的 C++ redis 客户端库增加至 acl 项目中

    虽然 redis 开发库已有不少,但 C/C++ 的客户端库好用的并不多,虽然官方也提供了 C 版的客户端库,但易用性较差,而且不支持连接池功能,相对于 C/C++ 的库,JAVA 版的 jedis ...

最新文章

  1. 不惧困难,阿特拉斯机器人展示超强平衡能力
  2. 解决maven构建webapp index.jsp报错问题
  3. python中import numpy_Python开发:NumPy学习(一)ndarray数组
  4. flink写入hive的时区问题
  5. java 获取td_[Java教程]jQuery获取table表中的td标签
  6. Redis:主从配置
  7. sysadmin默认密码_Sysadmin指南,开源电子邮件客户端,macOS应用程序,SELinux,Firefox扩展等...
  8. ExtJs学习笔记(2)_Basic GridPanel[基本网格]
  9. 【链表】Remove Duplicates from Sorted List II(三指针)
  10. 医疗器械/设备的法律法规汇总
  11. 一直以来伴随我的一些学习习惯(part1)
  12. Android仿人人客户端(v5.7.1)——有关滑动式左侧菜单实现过程中网友的疑问解答
  13. 小学计算机上机评分表,海安市实验小学信息技术学科素养考核方案
  14. 碱基数据处理中的算法研究
  15. python3入门教程 pdf_Python基础教程第3版(Beginning Python From Novice to Professional 3th) pdf...
  16. python实现企业微信定时发送文本消息!下班自动提交,老板直夸我敬业!
  17. 图像和流媒体 -- 帧率、分辨率、码流的概念和关系
  18. 调用第三方API ,实现手机号码归属地及运营商查询
  19. STM32F105双CAN双FIFO通讯心得体会
  20. 数据库MySQL服务

热门文章

  1. Attach、Detach和DeleteObject
  2. redisflush操作
  3. 7-5 计算个人所得税 (20分)
  4. Java使用aspose批量将PDF转为word
  5. openlayers中使用rBush(R树)来存放要素等信息,本文修改了一点其中的rbush源码中的demo,使用canvas画出了insert和delete操作(建立树和删除树中数据)
  6. 北交中外合作计算机类出国留学,北交大中外合作办学怎么样
  7. 分布式--生成数据库全局唯一ID--方法/方案
  8. 顺序表的基本操作C++
  9. rust建造一键升级_rust 使用国内镜像,快速安装方法
  10. 简单处理Ubuntu无法联网的问题