Redis - 解析远程服务器提供的数据流
我在本地设置了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'
我不知道是否有所有线路完全格式化的保证,但我们认为他们是。
解析单个非空行成键/值对是简单的:
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)
的实现作为练习留给读者。
非常感谢!这绝对有帮助! – lacrima
不客气;-) –
'hset'有什么问题? https://redis-py.readthedocs.io/en/latest/#redis.StrictRedis.hset - https://redis.io/commands/hset –
@brunodesthuilliers这个问题可能太基本,但我无法弄清楚如何在使用'hset'时引用数据流的ID和值。 hset(hash1,user,1)似乎当然很容易,但是如何解析持续变化的数据? – lacrima
首先,请编辑你的问题来解释你真正的问题是什么 - 它显然不是关于redis,而是关于如何解析你的传入数据。然后添加传入数据的示例_and_他们应该看起来像一旦解析。 –