前段时间在项目中碰到一个redis list插不进去的问题。背景是使用了redis list做消息队列,有两个服务器,server1存贮的redis string 类型的key的value是服务器1自己的mq1,server2要将消息插入server1的mq1。然后server1在读出这个mq1中存贮的消息。再去做一些业务操作。server1对mq1采用的是brpop,也就是阻塞的拿消息。
下面将mq这个redis list的key成为mq1。
我碰到了一个很奇葩的问题,server2从redis中读出了mq1,然后往mq1插入也没有报错。但是server1对mq1进行brpop一直拿不到消息。很是纳闷。甚至一度以为redis除了问题。下面进入艰难的调试过程。
先查看redis有多少连接
因为无论哪个server,对redis来说都是client进行操作,就想查看redis的连接。是会不会有别的server和我pop了同一个list,可以用client list命令查看。下面的输出是举例,调试时的输出已经过去太久找不到了。例如:
127.0.0.1:6006> client list
id=381 addr=192.xxx.xx.x:27804 fd=15 name= age=1367 idle=36 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
id=385 addr=192.xxx.xx.x:52192 fd=10 name= age=8 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r c