我正在使用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)
,它也可以打印出所有数据。
我的代码出了什么问题?
答案 0 :(得分:1)
我假设你正在使用redis-py。
文档将
称为旧版本的lib ...也许您应该使用其他方法进行消息阅读。例如,使用回调@OneToMany()
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name="ID",referencedColumnName = "ID",insertable=false, updatable=false)
private List<DataDetails> dataDetails;
@OneToMany()
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name="ID",referencedColumnName = "ID",insertable=false, updatable=false)
private List<DataDetails> dataDetails;
编辑:
当您一次发布20000条消息时,您的redis服务器可能内存不足。尝试在listen
文件
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问题,了解有关如何处理它的更多信息。