我对我要问的问题的方方面面都很陌生。
我试图确定我是否能够成功地将一些作为json数据的轮询度量存储在redis中。
在某种程度上,我已经做到了。下面的python脚本将轮询设备,收回json数据,然后使用(rejson-https://redislabs.com/blog/redis-as-a-json-store/)将json数据推送到redis。
代码如下:
# !/usr/bin/env python
from __future__ import print_function
from functools import wraps
from pprint import pprint
import time
import sys
import acos_client as acos
import redis
import json
c = acos.Client('10.10.10.10', acos.AXAPI_21, 'username', 'password')
data = c.slb.service_group.stats('SG_SITE1.BUSINESS.COM_443')
# Open a connection to redis
r = redis.StrictRedis()
# Store the document
r.execute_command('JSON.SET', 'data', '.', json.dumps(data))
# Retrieve it
reply = json.loads(r.execute_command('JSON.GET', 'data'))
这是拉取并存储在redis中的数据:
{u'service_group_stat': {u'cur_conns': 344,
'date': '04-25-2017',
u'member_stat_list': [{u'cur_conns': 66,
u'req_bytes': 1476212423,
u'req_pkts': 10449342,
u'resp_bytes': 33132743858,
u'resp_pkts': 25652317,
u'server': u'WWW0006',
u'tot_conns': 172226},
{u'cur_conns': 64,
u'req_bytes': 1666275823,
u'req_pkts': 11982676,
u'resp_bytes': 37575461036,
u'resp_pkts': 29175599,
u'server': u'WWW0005',
u'tot_conns': 205244},
{u'cur_conns': 89,
u'req_bytes': 1671222671,
u'req_pkts': 11940864,
u'resp_bytes': 37064038202,
u'resp_pkts': 28747313,
u'server': u'WWW0004',
u'tot_conns': 195789},
{u'cur_conns': 37,
u'req_bytes': 94117510958,
u'req_pkts': 585916896,
u'resp_bytes': 1860691638618,
u'resp_pkts': 1439228725,
u'server': u'WWW0003',
u'tot_conns': 7366402},
{u'cur_conns': 42,
u'req_bytes': 98580368121,
u'req_pkts': 642797814,
u'resp_bytes': 1934241923560,
u'resp_pkts': 1498242871,
u'server': u'WWW0002',
u'tot_conns': 7221995},
{u'cur_conns': 46,
u'req_bytes': 94886760323,
u'req_pkts': 593577169,
u'resp_bytes': 1863028601218,
u'resp_pkts': 1441197389,
u'server': u'WWW0001',
u'tot_conns': 7260787}],
u'name': u'SG_SITE1.BUSINESS.COM_443',
u'req_bytes': 292398350319,
u'req_pkts': 1856664761,
u'resp_bytes': 5765734406492,
u'resp_pkts': 4462244214,
'time': '11:00:00',
u'tot_conns': 22422443}}
当我在redis中检查“data”时,我看到了被推送的data/json:
127.0.0.1:6379> json.get data
"{\"service_group_stat\":{\"status\":3,\"protocol\":2,\"name\":\"SG_SITE1.BUSINESS.COM_443\",\"cur_reqs\":0,\"resp_pkts\":4472667457,\"cur_conns\":306,\"total_reqs\":0,\"total_reqs_succ\":0,\"req_pkts\":1860880754,\"req_bytes\":293088668161,\"member_stat_list\":[{\"status\":1,\"resp_bytes\":35542787582,\"cur_reqs\":0,\"resp_pkts\":27513984,\"cur_conns\":72,\"total_reqs\":0,\"server\":\"WWW0006\",\"req_pkts\":11202756,\"req_bytes\":1601613790,\"total_reqs_succ\":0,\"tot_conns\":181675,\"port\":81},{\"status\":1,\"resp_bytes\":39991941399,\"cur_reqs\":0,\"resp_pkts\":31033672,\"cur_conns\":45,\"total_reqs\":0,\"server\":\"WWW0005\",\"req_pkts\":12730038,\"req_bytes\":1788901352,\"total_reqs_succ\":0,\"tot_conns\":214379,\"port\":81},{\"status\":1,\"resp_bytes\":38939383008,\"cur_reqs\":0,\"resp_pkts\":30207188,\"cur_conns\":41,\"total_reqs\":0,\"server\":\"WWW0004\",\"req_pkts\":12545969,\"req_bytes\":1770117987,\"total_reqs_succ\":0,\"tot_conns\":203326,\"port\":81},{\"status\":1,\"resp_bytes\":1863483461334,\"cur_reqs\":0,\"resp_pkts\":1441396536,\"cur_conns\":34,\"total_reqs\":0,\"server\":\"WWW0003\",\"req_pkts\":586827719,\"req_bytes\":94258771440,\"total_reqs_succ\":0,\"tot_conns\":7378462,\"port\":81},{\"status\":1,\"resp_bytes\":1935723181356,\"cur_reqs\":0,\"resp_pkts\":1499389206,\"cur_conns\":48,\"total_reqs\":0,\"server\":\"WWW0002\",\"req_pkts\":643286283,\"req_bytes\":98658443365,\"total_reqs_succ\":0,\"tot_conns\":7228301,\"port\":81},{\"status\":1,\"resp_bytes\":1865535919223,\"cur_reqs\":0,\"resp_pkts\":1443126871,\"cur_conns\":66,\"total_reqs\":0,\"server\":\"WWW0001\",\"req_pkts\":594287989,\"req_bytes\":95010820227,\"total_reqs_succ\":0,\"tot_conns\":7271565,\"port\":81},{\"status\":0,\"resp_bytes\":0,\"cur_reqs\":0,\"resp_pkts\":0,\"cur_conns\":0,\"total_reqs\":0,\"server\":\"WWW03\",\"req_pkts\":0,\"req_bytes\":0,\"total_reqs_succ\":0,\"tot_conns\":0,\"port\":81},{\"status\":0,\"resp_bytes\":0,\"cur_reqs\":0,\"resp_pkts\":0,\"cur_conns\":0,\"total_reqs\":0,\"server\":\"WWW01\",\"req_pkts\":0,\"req_bytes\":0,\"total_reqs_succ\":0,\"tot_conns\":0,\"port\":81},{\"status\":0,\"resp_bytes\":0,\"cur_reqs\":0,\"resp_pkts\":0,\"cur_conns\":0,\"total_reqs\":0,\"server\":\"WWW02\",\"req_pkts\":0,\"req_bytes\":0,\"total_reqs_succ\":0,\"tot_conns\":0,\"port\":81}],\"time\":\"13:20:57\",\"date\":\"04-25-2017\",\"resp_bytes\":5779216673902,\"tot_conns\":22477708}}"
到目前为止看起来还不错吧?
问题是我不确定如何在不覆盖现有“数据”的情况下正确地处理推送下一组数据?
我意识到这就是将它作为“数据”保存到redis的原因:
r.execute_command('JSON.SET', 'data', '.', json.dumps(data))
目标是拥有多组数据,因为其中包括日期和时间。
我希望用它来存储每5分钟为每个“服务组”和其中包含的服务器提取的这些度量中的一个小时。
所以我对学习和理解如何实现这个目标很感兴趣?
**其他细节/对问题的答复**
最终目标是能够使用某种图形/报告工具,该工具可以访问数据并显示给定时间段内“服务组”的度量,以及扩展“服务组”并查看与该“服务组”内的每个成员/服务器相关联的度量的能力。“Roup”。
最佳答案
redis(data
)中的每个键都是一个数据结构,在您的例子中,数据结构是一个json文档。至少有两种方法可以“保存多个集合”:1)使用多个键和/或2)在键中使用json嵌套。
redis可以保存很多密钥(确切地说是2^32-1)。您可以将每个json文档存储在不同的密钥下。密钥名称应该是唯一的,因此名称和时间戳的组合可以做到这一点,即:
...
name = 'SG_SITE1.BUSINESS.COM_443'
data = c.slb.service_group.stats(name)
...
keyname = '{}:{}'.format(name, data['service_group_stat']['date'])
r.execute_command('JSON.SET', keyname, '.', json.dumps(data))
...
使用另一种方法,即使用一个键(例如
data
或SG_SITE1.BUSINESS.COM_443
),但在其中嵌套多个文档,例如,如果您将文档视为一个对象,其中每个键可能是日期,即:{'04-25-2017':
{u'service_group_stat': {u'cur_conns': 344,
'date': '04-25-2017',
...
},
'04-24-2017':
{u'service_group_stat': {u'cur_conns': 344,
'date': '04-24-2017',
...
所以基本上,应该是这样的:
...
name = 'SG_SITE1.BUSINESS.COM_443'
data = c.slb.service_group.stats(name)
...
path = '.["{}"]'.format(data['service_group_stat']['date'])
r.execute_command('JSON.SET', name, path, json.dumps(data))
...
当然,真正的问题是,一旦数据就位,您希望如何处理它;)
另外,我对我在电子邮件上的延误表示歉意——这是讨论这个话题的一个更好的媒介,因为它可能有利于后代:p
关于python - 有关在Redis中存储此数据(JSON)而不覆盖现有的建议吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43618571/