使用GO語言開發 Redis資料監控程式

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

使用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’

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.