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客户端的输出缓冲区就会
暴涨,可能瞬间占用大量内存。