2017-01-02 29 views
0

我在本地设置了Redis,我想连接到提供合成数据流的远程服务器,其格式为< ID,value>。到目前为止,我已经使用套接字连接到上面提到的服务器,读取数据流并打印出来。相反,我想将这些对存储在散列数据结构中(我将在稍后存储有关每个ID的更多信息)。问题是,我不知道如何解析数据流,以便使用hget以及如何连续使用。在更高层次上,我希望能够将传入数据流中的Name和Value作为参数传递给hget。忘了提及我正在使用Python API。 到目前为止:Redis - 解析远程服务器提供的数据流

import socket 
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client_socket.connect(('xx.xx.xx.xxx', 1337)) 
while 1: 
     data = client_socket.recv(512) 
     print data 

数据流的样本:

'AMZN,780.6758\n' 
'TSLA,197.1802\n' 
'CSCO,29.7491\n' 
'GOOG,761.3758\n' 
'AAPL,112.4122\n' 
'GRPN,4.5848\n' 
'FB,121.1232\n' 
'MSFT,60.3529\n' 
'INTC,35.9056\n' 
'NVDA,94.473\n' 
'QCOM,68.7389\n' 
'AMZN,780.6761\n' 
'TSLA,197.1798\n' 
'CSCO,29.7486\n' 
'GOOG,761.3755\n' 
'AAPL,112.4122\n' 
'GRPN,4.5848\n' 
'FB,121.1237\n' 
'MSFT,60.353\n' 
'INTC,35.9054\n' 
'NVDA,94.473\n' 
'QCOM,68.7391\n' 

我不知道是否有所有线路完全格式化的保证,但我们认为他们是。

+0

'hset'有什么问题? https://redis-py.readthedocs.io/en/latest/#redis.StrictRedis.hset - https://redis.io/commands/hset –

+0

@brunodesthuilliers这个问题可能太基本,但我无法弄清楚如何在使用'hset'时引用数据流的ID和值。 hset(hash1,user,1)似乎当然很容易,但是如何解析持续变化的数据? – lacrima

+0

首先,请编辑你的问题来解释你真正的问题是什么 - 它显然不是关于redis,而是关于如何解析你的传入数据。然后添加传入数据的示例_and_他们应该看起来像一旦解析。 –

回答

1

解析单个非空行成键/值对是简单的:

key, value = line.strip().split(",", 1) 

假设你的数据可能是不完整的(无端接的记录),并且它是标记的端部的换行记录,你可以存储记录不全的缓冲和解析之前添加它们,所以你的函数可能是这个样子:

def run(client_socket): 
    buffer = "" 
    while True: 
     data = client_socket.recv(512) 
     # not sure the following lines makes sense - 
     # you may actually want to handle exceptions 
     # or whatever 
     if not data: 
      break 

     # add the buffer back 
     data = buffer + data 
     # split on newlines 
     lines = data.splitlines() 
     # check if we have an incomplete record 
     # (if it doesn't end with a newline) 
     if data[-1] != '\n': 
      # incomplete record, store it back so 
      # we process it next time 
      buffer = lines.pop() 
     else: 
      # all records complete for this call, 
      # empty the buffer for next turn 
      buffer = "" 

     # now handle our records:  
     for line in filter(None, lines): 
      k, v = line.split(",", 1) 
      do_something_with(k, v) 

do_something_with(k, v)的实现作为练习留给读者。

+0

非常感谢!这绝对有帮助! – lacrima

+0

不客气;-) –

相关问题