Python redis订阅无法获取所有数据?

时间:2017-06-27 10:02:17

标签: python redis queue apache-kafka

我正在使用python从redis获取数据,然后将其解析为kafka。它适用于大多数情况。

但是当我使用python来模拟将数据构建为redis,或者在queuen中存在快速输入数据时,我无法获得所有数据。

这是关于redis生产者的代码,用于模拟构建20000数据到redis:

rc = redis.Redis(host='127.0.0.1', port=6379)
rc.ping()
ps = rc.pubsub()
ps.subscribe('bdwaf')
r_str = "--8198b507-A--\n[22/Jun/2017:14:13:19 +0800]ucTcxcMcicAcAcAcicAcAcAm 192.168.1.189 50054 127.0.0.1 80\n"
for i in range(0, 20000):
    rc.publish('bdwaf', r_str)

和redis消费者也是kafka制作人:

rc = redis.Redis(host='localhost', port=6379)
rc.ping()
ps = rc.pubsub()
ps.subscribe('bdwaf')
num = 0
for item in ps.listen():
     if item['type'] == 'message':
         num += 1
         a.parser(item['data'])
         print num

它只打印出4000个数据。

如果我评论a.parser(item['data']),它可以打印出所有数据号。

或者在redis生产者中的sleep(0.001),它也可以打印出所有数据。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

我假设你正在使用redis-py

文档将

@OneToMany()
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name="ID",referencedColumnName = "ID",insertable=false, updatable=false)
    private List<DataDetails> dataDetails;

称为旧版本的lib ...也许您应该使用其他方法进行消息阅读。例如,使用回调

@OneToMany()
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name="ID",referencedColumnName = "ID",insertable=false, updatable=false)
    private List<DataDetails> dataDetails;

编辑:

当您一次发布20000条消息时,您的redis服务器可能内存不足。尝试在listen文件

中增加redis内存
p = r.pubsub()

def my_handler(message):
    print 'MY HANDLER: ', message['data']
    if item['type'] == 'message':
         num += 1
         a.parser(item['data'])
         print num

p.subscribe('bdwaf', my_handler)
# read the subscribe confirmation message
p.get_message()

这是一个内存问题,请查看this问题,了解有关如何处理它的更多信息。