如何为Redis编写1个轻量的Web接口

在项目开发中,有时候会用到redis这个NoSQL数据库。有些时候,我们需要对redis进行一些监控的工作,这样迫使我们需要有1个Web界面方便我们操作。
这里,我们通过Python的redis库来实现1个轻量级的监控页面,可以实现获取当前连接到redis服务器上的客户端以及数据库中的所有键值对。

import redis    

r = redis.StrictRedis(host= "127.0.0.1", port= 6379, db = 0)

这里我们引入redis库,然后创建了1个StrictRedis类实例。由于当前是在本机进行,因此host参数为本地地址,采用默认端口6379,数据库选择第0个。
接下来,我们要获取当前连接到redis服务器的所有客户端,我们可以通过client list命令来实现:

def get_clients():    
    return r.client_list()

这个函数会返回1个列表对象,里面可能储存多个字典类型的数据。
接下来,我们需要实现的是redis数据库的一些信息,比如使用内存的情况,客户端连接的数量等。关于这些内容,我们可以通过info命令来得到,返回的内容主要包括server、clients、memory、persistence、stats、cpu、replication、cluster等节。
这里我们选取几个我们感兴趣的键名,如下所示:

  • used_memory_human,已经使用的内存(人性化显示)。
  • config_file,配置文件的位置。
  • connected_clients,连接的客户端数量。
  • connected_slaves,连接的从服务器数量。
  • multiplexing_api,redis服务器使用的事件循环机制。
  • process_id,服务器进程的PID。
  • os,redis服务器主机的操作系统。
  • redis_version,redis服务器的版本。
  • arch_bits,主机的架构(32位还是64位).
  • tcp_port,坚挺的TCP/IP端口。
  • role,该数据库的角色,是主服务器还是从服务器。

这里我们将其封装为1个get_info函数:

def get_info():    
    info = r.info()    
    request = ["used_memory_human", "config_file", "connected_clients",    
               "connected_slaves", "multiplexing_api", "process_id",    
               "os", "redis_version", "arch_bits", "tcp_port", "role"]    
    response = {}    
    for r in request:    
        response[r] = info[r]    
    return response

在info函数中,我们可以传入我们关心的节的名称,它将只返回该节的内容。
接下来,我们要得到的是数据库中所有的键名及其键值。为了实现这个功能,我们需要借助scan命令,这个命令在版本2.8.0时可用。它将迭代当前选择的redis数据库的键名。

cursors, keys = r.scan()

这个操作会返回当前的游标,以及迭代得到的键名的列表。得到这些键名后,我们想知道其键值是什么,redis有那么多的数据类型,我怎么知道该用哪个命令获取其数值呢?
这里,我们借助type命令判断其类型。返回的结果可能是string、list、set、zset和hash。因此,我们需要通过迭代的方式进行逐一的获取其键值:

def get_values():    
    cursors, keys = r.scan()    
    data = {}    
    for k in keys:    
        t = r.type(k)    
        if t == "string":    
            val = r.get(k)    
        elif t == "list":    
            val = r.lrange(k,0,-1)    
        elif t == "set":    
            val = r.smembers(k)    
        elif t == "zset":    
            val = r.zrange(k, 0, -1, withscores= True)    
        elif t == "hash":    
            val = r.hgetall(k)    
        data[k] = val    
    return data

这是完整的get_values的代码,这里使用if语句根据不同的类型调用不同的函数,在Python中不存在switch语句。虽然可以模拟switch函数,但是这里由于类型不同传入的参数不同,无法正常模拟。
这样,我们便得到我们想要的数据了。接下来就是在Web框架中将这些数据给渲染到页面了。

参考文章:

http://redis.io/commands/info
http://redis.io/commands/scan
http://redis.io/commands/type
http://redis.io/commands/client-list

若文章对您有帮助,请打赏1块钱。您的支持,可以让我分享更多精彩的文章。转载请注明来源


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。