场景
业务上有一个需求,是将Redis作为消息队列,然后消费者消费队列中的数据。
问题
Redis 列表中长时间没有数据,等再有新的数据的时候仍然没有消费到数据,查看Redis,数据是存在的。
# 由于只有消费侧有问题,因此只有消费侧的代码
class RedisCli:
# 这个类只是封装了一下redis 连接池
def __init__(self, *args, **kwargs):
pass
def get_conn(self):
# 返回一个redis连接
redis_cli = RedisCli(**REDIS_CONF).get_conn()
res = redis_cli.brpop(REDIS_CALLBACK_NAM)
解决办法
在获取数据的时候加上timeout。
redis_cli = RedisCli(**REDIS_CONF).get_conn()
res = redis_cli.brpop(REDIS_CALLBACK_NAM, timeout=10)
原因
测试原因是因为py-redis在消费不到数据之后处于阻塞状态,此时如果存在网络波动或者是其他原因可能导致连接池失效,这里申明一下,redis-pu是有连接状态检查功能的,但是由于程序处于阻塞状态,所以没有办法进行连接状态的检查,所以使用超时功能,让程序不至于长时间处于阻塞状态。