這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
使用GO語言開發 Redis資料監控程式
簡介
Go語言是Google推出的一種全新的程式設計語言,具有文法簡潔但功能強大的特性,一經推出就頗受好評。
最近工作中經常需要即時監控和管理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 mainimport ( "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 poolfunc 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’
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。