2017-01-02 5 views
0

ローカルのRedisをセットアップしました。< ID、value>の形式で合成データストリームを提供するリモートサーバーに接続します。私は今までソケットを使って上記のサーバーに接続し、データストリームを読んでそれを印刷しました。代わりに、私はハッシュデータ構造のペアを保存したい(私は後で各IDについてのより多くの情報を保存するつもりだ)。問題は、データストリームを解析してhgetを使用する方法とそれを連続的に使用する方法がわからないことです。より高いレベルでは、入力データストリームから名前と値を引数として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

まず、あなたの本当の問題が何であるかを説明するためにあなたの質問を編集してください。それは明らかにあなたの入ってくるデータを解析する方法についてです。次に、着信データのサンプルを追加し、一度解析するとどのように見えるかを示します。 –

答えて

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

歓迎します;-) –

関連する問題