使用GO语言开发 Redis数据监控程序
2015-09-28 16:40
761 查看
使用GO语言开发 Redis数据监控程序
简介
Go语言是谷歌推出的一种全新的编程语言,具有语法简洁但功能强大的特性,一经推出就颇受好评。最近工作中经常需要实时监控和管理Redis中的数据,正好可以利用Go开发一些监控管理工具。
本文以开发一个实时监控和管理Redis中的在线用户信息为例,演示如何使用Go方便的开发Redis客户端程序。
选择redis Go客户端
业界有很多不错的Go客户端程序,本文选择使用redigo,地址:github.com/garyburd/redigo/redisGo中安装依赖很简单,一个get命令即可:
go get github.com/garyburd/redigo/redis
使用flag解析参数
flag.String(name string, value string, usage string) *stringflag.Parse()
使用简单,唯一要注意返回的类型是字符指针
也可以使用
flag.StringVar(p *string, name string, value string, usage string)
使用redis pool
type Pool struct { Dial func() (Conn, error) TestOnBorrow func(c Conn, t time.Time) error MaxIdle int MaxActive int IdleTimeout time.Duration ... }
构造redis pool对象,主要提供Dial,TestOnBorrow,MaxIdle,MaxActive,IdleTimeout几个参数
代码逻辑比较简单,直接看代码即可
完整代码
package main import ( "flag" "fmt" "github.com/garyburd/redigo/redis" "time" ) var ( cacheKey = "onlineClient" redisServer = flag.String("redisServer", "10.1.1.10:6379", "") redisPassword = flag.String("redisPassword", "", "") userId = flag.String("userId", "", "") kickCmd = flag.String("kick", "", "") clearCmd = flag.String("clear", "", "") ) type redisClient struct { pool *redis.Pool } //获取所有在线用户 func (c *redisClient) GetAll() { conn := c.pool.Get() clients, err := redis.StringMap(conn.Do("HGETALL", cacheKey)) if err != nil { panic(err) } fmt.Printf("online client: %d \n", len(clients)) for uId, client := range clients { fmt.Printf("%s -- %s\n", uId, client) } } //根据用户ID获取单个用户 func (c *redisClient) GetOne(id string) { client, err := redis.String(c.pool.Get().Do("HGET", cacheKey, id)) if err != nil { panic(err) } fmt.Println(client) } //踢出某个用户 func (c *redisClient) Kick(id string) { result, err := c.pool.Get().Do("HDEL", cacheKey, id) if err != nil { panic(err) } fmt.Println(result) } //清除所有在线用户信息 func (c *redisClient) ClearAll() { result, err := c.pool.Get().Do("DEL", cacheKey) if err != nil { panic(err) } fmt.Println(result) } //关闭redis连接池 func (c *redisClient) Close() { if c.pool != nil { c.pool.Close() } } func newClient(server, password string) *redisClient { return &redisClient{ pool: newPool(server, password), } } //创建redis connection pool func newPool(server, password string) *redis.Pool { return &redis.Pool{ MaxIdle: 3, IdleTimeout: 240 * time.Second, Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", server) if err != nil { return nil, err } if password != "" { if _, err := c.Do("AUTH", password); err != nil { c.Close() return nil, err } } return c, nil }, TestOnBorrow: func(c redis.Conn, t time.Time) error { _, err := c.Do("PING") return err }, } } func main() { flag.Parse() client := newClient(*redisServer, *redisPassword) defer client.Close() if *kickCmd != "" { client.Kick(*userId) } if *clearCmd == "all" { client.ClearAll() } if *userId == "" { client.GetAll() } else { client.GetOne(*userId) } }
生成本地程序,可以与linux其它工具联合使用
编译成本地程序go build -o rc redisclient.go
chmod a+x rc
运行客户端程序:
./rc
查看帮助信息
./rc -h
搜索在线用户信息
./rc | grep ‘username’
查看单个在线用户
./rc -userId ‘10030’
相关文章推荐
- Redis 禁用FLUSHALL FLUSHDB KEYS 命令
- redis php扩展安装
- Redis 内存数据库
- linux 下安装redis
- mac下redis的安装
- Redis介绍 && Java客户端操作Redis
- linux下安装redis
- Redis的安装和启动
- Sentinel模式下的主从切换
- Redis 使用.net实际教程
- Redis 宕机之后 启动失败 启动不了 原因之一 aof 文件出错 以及持久化介绍
- Java下利用Jedis开发Redis
- 【推荐】redis的主从复制配置
- redis在.net架构中的应用
- Redis 在线测试
- redis.conf配置详细解析
- Redis 作为多个Windows服务运行配置方法
- Cygwin编译redis
- redis有string,hash,list,sets.zsets几种数据类型
- redis key,string,hash,list,set,zset指令汇总