2017-01-02 1 views
0

J'ai configuré Redis localement et je souhaite me connecter à un serveur distant qui fournit un flux de données synthétique sous la forme < ID, valeur>. J'ai jusqu'ici réussi à me connecter au serveur mentionné ci-dessus en utilisant des sockets, lire le flux de données et juste l'imprimer. Au lieu de cela, je veux stocker les paires dans une structure de données de hachage (je vais stocker plus d'informations sur chaque ID plus tard). Le problème est que je ne sais pas comment analyser le flux de données afin d'utiliser hget et comment continuellement. Dans un niveau supérieur, je voudrais être en mesure de passer Name et Value du flux de données entrant comme arguments à hget. J'ai oublié de mentionner que j'utilise l'API Python. Jusqu'à présent:Redis - Analyser le flux de données fourni par le serveur distant

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 

Un échantillon du flux de données:

'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' 

Je ne sais pas s'il y a une garantie que toutes les lignes sont formatés, mais nous allons qu'ils sont.

+0

qu'est-ce qui ne va pas avec 'hset'? https://redis-py.readthedocs.io/en/latest/#redis.StrictRedis.hset - https://redis.io/commands/hset –

+0

@brunodesthuilliers La question est peut-être trop simple mais je n'arrive pas à comprendre comment faire référence à l'ID et à la valeur du flux de données en utilisant 'hset'. hset (hash1, user, 1) semble bien sûr facile mais comment analyser des données qui changent continuellement? – lacrima

+0

Tout d'abord, veuillez modifier votre question pour expliquer quel est votre véritable problème - il ne s'agit évidemment pas de redis mais de la façon d'analyser vos données entrantes. Puis ajoutez des exemples de vos données entrantes _et_ à quoi elles devraient ressembler une fois analysées. –

Répondre

1

Parsing une seule ligne non vide dans une paire clé/valeur est aussi simple que:

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

En supposant que vos données peuvent être incomplètes (enregistrement non terminé) et qu'il est le saut de ligne qui marque la fin d'une enregistrement, vous pouvez stocker des enregistrements incomplets dans un tampon et les ajouter avant l'analyse, de sorte que votre fonction pourrait ressembler à ceci:

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) 

la mise en œuvre de do_something_with(k, v) est laissée en exercice au lecteur.

+0

Merci beaucoup! Cela aide définitivement! – lacrima

+0

De rien ;-) –