【redis】Jedis中的连接异常

1.Jedis中的连接异常

stream: 
 world 
 Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException:
    Unexpected end of tream;
	
redis的默认配置给出了timeout=0,在这种情况下客户端基本不会出现上面的异常,
这是基于对客户端开发的一种保护。很多人在使用JedisPool时不会对连接池对象
做空闲检测和验证,如果设置了timeout>0,可能就会出现上面的异常,对应用业务
造成一定影响,但是如果redis的客户端使用不当或者客户端本身的一些问题,
造成没有及时释放客户端连接,可能会造成大量的idle连接占用大量的连接资源,
一旦超过maxclients,则关闭退出。

实际开发中,将timeout设置大于0,同时在客户端使用上添加空闲检测和验证等错误。
JedisPool使用common-pool提供三个属性:minEvictableIdleTimeMills,
testWhileIdle,timeBetweenEvictionRunsMills;

2.客户端类型。

client list 中的flag是用于表示当前客户端的类型。
客户端类型:说明 
N:普通客户端。
M:当前客户端是master主节点。
S:当前客户端是slave节点
O:当前客户端在执行monitor命令
x:当前客户端正在执行事务。
b:当前客户端正在等待阻塞事件。
i:当前客户端正在等待VM I/O,但是此状态目前已经废弃不用。
d:一个受监视的键已经修改,EXEC命令将失败。
u:客户端未被阻塞
c:回复完整输出后,关闭连接。
A:就可能快的关闭连接。

3.client list 属性说明

参数:含义 
id:客户端连接ID  
addr:客户端连接IP和端口 
fd:socket的文件描述符 
name:客户端连接名 
age:客户端连接存活时间。
idle:客户端连接空闲时间
flags:客户端类型标识 
db:当前客户端正在使用的数据库索引下标 
sub/psub:当前客户端订阅的频道或者模式数
multi:当前事务中已经执行命令个数
qbuf:输入缓冲区总容量 
qbuf-free:输入缓冲区剩余容量 
obl:固定缓冲区的长度 
oll:动态缓冲区列表长度 
omem:固定缓冲区和动态缓冲区使用的容量。
events:文件描述符事件(r/w):r和w分别代表客户端套接字可读和可写。
cmd:当前客户端最后一次执行的命令,不包含参数。

4.client setName 和client getName 

192.168.1.7:6379> client setName myclient
OK
192.168.1.7:6379> client getName
"myclient"

client setName用于给客户端设置名字,这样比较容易标识出客户端
的来源。

192.168.1.7:6379> client list
id=3 addr=192.168.1.7:35700 fd=7 name=myclient age=88 idle=64 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=4 addr=192.168.1.7:35702 fd=8 name= age=2 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

redis只有一个应用方使用的情况下,IP和端口作为标识会更加清晰。

--client kill addr  杀掉一个客户端。

192.168.1.7:6379> client list
id=5 addr=192.168.1.7:35704 fd=7 name=myclient age=63 idle=40 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=6 addr=192.168.1.7:35706 fd=8 name= age=0 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
192.168.1.7:6379> 
192.168.1.7:6379> 
192.168.1.7:6379> client kill 192.168.1.7:35704
OK
192.168.1.7:6379> client list
id=6 addr=192.168.1.7:35706 fd=8 name= age=33 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

5.client pause 

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

所有的客户端,包括当前客户端均处于夯死状态。
无法正常连接。

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

client pause 可以用一种可控的方式将客户端连接从一个redis节点切换到
另一个redis节点。
生产环境中,暂停客户端的成本非常高,禁用。

--redis的ping名,检查redis是否阻塞。
192.168.1.7:6379> ping 
PONG

6.monitor 

monitor命令用于监控redis正在执行的命令。

--打开一个客户端执行monitor;
--打开其他客户端执行命令,可以看到monitor的界面显示所有其他客户端执行的命令。
192.168.1.7:6379> monitor
OK
1718929481.522867 [0 192.168.1.7:35718] "keys" "*"
1718929491.271495 [0 192.168.1.7:35718] "rename" "a" "mya"
1718929497.151909 [0 192.168.1.7:35718] "get" "mya"
1718929516.615085 [0 192.168.1.7:35722] "COMMAND"
1718929518.974629 [0 192.168.1.7:35722] "keys" "*"
1718929536.984880 [0 192.168.1.7:35722] "rename" "f" "myf"
1718929544.548317 [0 192.168.1.7:35722] "get" "myf"
1718929561.232073 [0 192.168.1.7:35722] "set" "myf" "My F bangbangda"

monitor可以监听正在执行的命令,但是每个客户端都有自己的
输出缓冲区,一旦redis的并发量过大,monitor客户端的输出缓冲区就会
暴涨,可能瞬间占用大量内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值