开发者社区> 问答> 正文

redis 阻塞队列 无法读取数据?报错

代码:

PushThread pushThread = new PushThread();
pushThread.setName("PUSH-Thread");
pushThread.start();//每隔20分钟往redis里面放数据

PullThread pullThread = new PullThread();
pushThread.setName("PULL-Thread");
pullThread.start();//使用 rightPop 读取数据


读取的方式:


template.opsForList().rightPop(key,0,TimeUnit.MINUTES);


那么问题来了:阻塞时间过长以后,rightPop不在返回数据,也没有报错。redis队列数据一直增加,不见消费。


在这里怀疑是当前被阻塞的redis连接线程死了,没有得到释放。


接着做测试:同样的代码,连接我本地启动的redis时,现象变成:5分钟以后,抛出异常如下:

 redis.clients.jedis.exceptions.JedisConnectionException: It seems like server has closed the connection.

但是rightPop是继续工作的,不影响返回的数据。

到这里是不是该怀疑redis配置的问题?但是抛出异常也是不正常的情况。因此想求助各位大神,望能解开这一团迷雾,让小子可以开开心心回家.....谢谢啦~

展开
收起
爱吃鱼的程序员 2020-06-09 14:36:41 1010 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    问题解决了吗

    我换成短周期循环来做类似队列的取出功能了,lrange和ltrim联合使用。

    死循环中,第一步判断key存不存在,不存在睡眠500ms;存在就用lrange和ltrim,来取出头或者尾的第一个数据。

    建议生产者端用心跳包,感觉是jedis框架的问题,时间太久连接假死,有点像SSH连接没设置心跳包,连接断开的问题
    2020-06-09 14:36:59
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis集群演化的心路历程——从2.x到3.0时代 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载