编写python脚本:扫描redis中终端在线集合和查询终端状态表。
在redis中,终端在线集合是有序集合存储方式,成员是终端状态表名。终端状态表以hash方式存储,是一个string类型的field和value的映射表。
1、脚本第一行是指出代码用什么可执行程序运行。在此之前,我一般使用:
#!/usr/bin/python(路径使用which python查找)
看到公司开发人员脚本使用的是:
#!/usr/bin/env python
稍有疑惑,百度之后推荐使用第二种方法。优点是,该方法到env中寻找python的安装路径,再调用对应路径下的解释器程序完成操作。路径不是写死的,可移植性高。
2、编写脚本如下
#!/usr/bin/env python
#coding=utf-8
#扫描终端在线集合和查询终端状态表
import redis
import json
#连接redis
r = redis.Redis(host='127.0.0.1', port=1000, db=0)
#查询终端在线集合中所有的在线终端
zd_onlines = r.zrange('zset_zd_online',0,-1)
#print(zd_onlines)
#新建文件,用来保存在线终端和终端状态表结果
filename1 = 'zd_online.txt'
filename2 = 'zd_zdtus.txt'
#将查询到的所有在线终端结果存在文件中,以行分开
with open(filename1,'w') as file_object1:
for zd_online in zd_onlines:
#print(zd_online)
file_object1.write(zd_online)
file_object1.write("\n")
#以行读取在线终端
with open(filename1) as file_object1:
zds = file_object1.readlines()
for zd in zds:
zd = zd.strip('\n')
#print(zd)
#查询在线终端状态表
zd_zdtus = r.hgetall(zd)
zd_zdtuss = []
zd_zdtuss.append(zd_zdtus)
#print(zd_zdtuss)
#将查询的终端状态存在文件filename2中
with open(filename2,'a') as file_object2:
json.dump(obj=zd_zdtuss, fp=file_object2)
file_object2.write("\n")
第一次写文件filename1的数据是从redis查询到的终端在线集合,该数据是下一步需要使用的终端状态表。为了下一步使用方便,使用了分行存储。再将filename1的数据使用readlines()方法,将所有行数据读取出来,因为默认每次读取会添加空行,使用strip('\n'),除去多余空行。使用for循环,每读取一行数据(一个终端状态表名)就查询其对应的终端状态表数据。
定义一个空列表,用来存放查询到的终端状态数据。使用append()方法,将在redis中查询的终端数据依次添加到定义的空列表中。
第二次写文件filename2,终端状态表数据格式读取出来是dict,将终端状态表的数据使用json.dump()函数转换成json信息写入文件,并且每个终端状态表数据之间使用空行隔开。具体使用什么方法可以根据实际需求确定。
也可以使用for循环直接遍历dict,不需要定义列表。
with open(filename1) as file_object1:
zds = file_object1.readlines()
for zd in zds:
zd = zd.strip('\n')
zd_zdtus = r.hgetall(zd)
with open(filename2,'a') as file_object2:
for k,v in zd_zdtus.items():
a = k + ":" + v
file_object2.write(a)
file_object2.write("\n")
这个脚本使用shell编写的话,更加简单:
#!/bin/bash
redis-cli -h 127.0.0.1 -p 1000 zrange zset_zd_online 0 -1 > zd_online.txt
while read myline
do
echo $myline >> zd_zdtus.txt
redis-cli -h 127.0.0.1 -p 1000 hgetall $myline >> zd_zdtus.txt
done < zd_online.txt
知识总结:
1、python操作redis方法
2、python读取写入文件方法
3、列表、字典遍历