Redis读书笔记(三)Redis客户端

Redis客户端与服务端的通信协议是建立在TCP协议基础上的,Redis定制了RESP来实现交互。
Java一般使用Jedis或者JedisPool来作为客户端。
Jedis支持Pipeline特性:下面的代码用Jedis来实现mdel功能。
Redis读书笔记(三)Redis客户端_第1张图片

Redis为每个客户端分配了输入缓冲区,他的作用是将客户端发送的命令临时保存。Redis中要求每个客户端的缓冲区大小不能超过1G,否则客户端会被关闭。
监控输入缓冲区异常的方法有两种:
1)通过定期执行client list命令,手机qbuf和qbuf-free找到异常连接记录并分析,最终找出可能出问题的客户端。
2)通过info命令的info clients模块,找到最大的输入缓冲区。

Redis为每个客户端分配了输出缓冲区,作用是保存命令执行结果给客户端。
可以根据客户端类型来设置输出缓冲区:
Redis读书笔记(三)Redis客户端_第2张图片
normal普通客户端,slave:slave客户端用于复制,pubsub:发布订阅客户端。

: 如果客户端使用的输出缓冲大于这个值,客户端会被立刻关闭。
和:如果使用的输出缓冲区超过了并且持续了秒,客户端立刻关闭。

和输入缓冲区相同,输出缓冲区也不会受到maxmemory的限制,使用不当回造成数据丢失,键值淘汰,OOM等情况。

一旦客户端连接的idle时间超过了timeout,连接将会被关闭。

可以通过monitor命令监控Redis正在执行的命令。

Redis读书笔记(三)Redis客户端_第3张图片
connected_clients:代表当前redis节点的客户端连接数。
client_longest_output_list:当前所有输出缓冲区中队列对象个数最大值。
client_biggest_input_buf:当前所有输入缓冲区中占用的最大容量。
blocked_clients:正在执行阻塞命令的客户端数。
Redis读书笔记(三)Redis客户端_第4张图片
total_connections_received:Redis 自启动以来处理的客户端连接数总数。
rejected_connections: Redis自启动以来拒绝的客户端连接数。

Redis客户端异常
1.无法从连接池获取到连接
JedisPool中Jedis对象的个数是有限的,默认是8个。如果对象都被占用,没有归还,就需要等待了,超时异常。jedis使用完毕后要及时归还。
2.客户端读写超时
在这里插入图片描述
造成该异常的原因有以下几种:
读写超时时间设置的过短。
命令本身就比较慢。
客户端与服务端网络不正常。
Redis自身发生阻塞。

3.客户端连接超时
在这里插入图片描述
1)超时时间设置的过短
2)Redis发生阻塞,造成tcp-backlog已满,造成新的连接失败。
3)客户端与服务端网络不正常。

4.客户端缓冲区异常
Jedis在调用Redis时,如果出现客户端数据流异常,会出现下面的异常
在这里插入图片描述
1)输出缓冲区满。比如将普通客户端的缓冲区设置为1M1M60,如果使用get命令获取一个bigkey(比如3M),就会出现这个异常。
2)长时间闲置连接被服务端主动断开。
3)不正常并发读写:Jedis对象同时被多个线程并发操作。

5.Redis正在加载持久化文件
Jedis调用Redis时,如果Redis正在加载持久化文件,就会收到下面的异常:
在这里插入图片描述

6.Redis使用的内存超过maxmemory配置
Jedis执行读写操作时,如果Redis的使用内存大鱼maxmemory的设置,就会报出如下异常,此时应该调整maxmemory并找到内存增长的原因。
在这里插入图片描述

7.客户端连接数超过了maxclients
在这里插入图片描述

你可能感兴趣的:(Java-后端)