使用GO语言开发 Redis数据监控程序
简介
Go语言是谷歌推出的一种全新的编程语言,具有语法简洁但功能强大的特性,一经推出就颇受好评。
最近工作中经常需要实时监控和管理Redis中的数据,正好可以利用Go开发一些监控管理工具。
本文以开发一个实时监控和管理Redis中的在线用户信息为例,演示如何使用Go方便的开发Redis客户端程序。
选择redis Go客户端
业界有很多不错的Go客户端程序,本文选择使用redigo,地址:github.com/garyburd/redigo/redis
Go中安装依赖很简单,一个get命令即可:
go get github.com/garyburd/redigo/redis
使用flag解析参数
flag.String(name string, value string, usage string) *string
flag.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’
版权声明:本文为博主原创文章,未经博主允许不得转载。
有疑问加站长微信联系(非本文作者)