Redigoを使う(5) ユーティリティ関数

はじめに

我們來看看專為Go語言設計的客戶端庫Redigo的使用方法。Redigo提供了許多實用的工具函數,方便簡潔的編程。我們將介紹其中一些主要的使用方法。

环境

    • OS: Windows 10

 

    • Redis: win-3.2.100

Go言語: 1.11

変数へ変換

サーバからの応答をGoの様々な型に変換する関数です。

整数型に変換するにはIntやInt64やUint64を用います。例えばRedisの文字列型で保存した数値をGETでとるときや、LLENなどの応答に使います。また、浮動小数点型に変換するにはFloat64、文字列型に変換するにはString、バイトスライスに変換するにはBytesを使います。

    var n int
    _, _ = conn.Do("SET", "money", "1000")
    n, _ = redis.Int(conn.Do("GET", "money"))
    fmt.Println(n) // 1000

    _, _ = conn.Do("RPUSH", "city", "tokyo")
    n, _ = redis.Int(conn.Do("LLEN", "city"))
    fmt.Println(n) // 1

    var f float64
    _, _ = conn.Do("SET", "temperature", "25.6")
    f, _ = redis.Float64(conn.Do("GET", "temperature"))
    fmt.Println(f) // 25.6

    var s string
    _, _ = conn.Do("SET", "weather", "rainy")
    s, _ = redis.String(conn.Do("GET", "weather"))
    fmt.Println(s) // rainy

    var b []byte
    _, _ = conn.Do("SET", "alphabet", "abc")
    b, _ = redis.Bytes(conn.Do("GET", "alphabet"))
    fmt.Println(b) // [97 98 99]

将其转换为切片

将来自Redis服务器的多个回复(多块回复)转换为切片。 如果要将它们全部转换为相同的类型,可以使用Ints、Float64s、Strings、ByteSlices等。 如果Ints或Float64s中有任何一个类型转换失败,将返回错误。

    var n []int
    _, _ = conn.Do("MSET", "width", "640", "height", "480")
    n, err = redis.Ints(conn.Do("MGET", "width", "height"))
    fmt.Println(n) // [640 480]

    var f []float64
    _, _ = conn.Do("MSET", "temperature", "25.6", "humidity", "10.3")
    f, _ = redis.Float64s(conn.Do("MGET", "temperature", "humidity"))
    fmt.Println(f) // [25.6 10.3]

    var s []string
    _, _ = conn.Do("RPUSH", "city", "tokyo")
    _, _ = conn.Do("RPUSH", "city", "osaka")
    s, _ = redis.Strings(conn.Do("LRANGE", "city", 0, -1))
    fmt.Println(s) // [tokyo osaka]

    var b [][]byte
    _, _ = conn.Do("RPUSH", "alphabet", "abc")
    _, _ = conn.Do("RPUSH", "alphabet", "def")
    b, _ = redis.ByteSlices(conn.Do("LRANGE", "alphabet", 0, -1))
    fmt.Println(b) // [[97 98 99] [100 101 102]]

当不同类型混合存在时,可以将其转换为interface{}切片以通过Values进行转换。而要进行批量转换,则可以使用Scan函数来实现方便。

    var weight int
    var eyesight float64
    var blood string
    var v []interface{}
    _, _ = conn.Do("SET", "weight", "60")
    _, _ = conn.Do("SET", "eyesight", "1.5")
    _, _ = conn.Do("SET", "blood", "A")
    v, _ = redis.Values(conn.Do("MGET", "weight", "eyesight", "blood"))
    v, _ = redis.Scan(v, &weight, &eyesight, &blood)
    fmt.Println(weight, eyesight, blood) // 60 1.5 A

将其转换为地图

在HGETALL(获取哈希类型的所有字段名和对应的值对)的响应中,字段名和值会交替出现。还提供了将其转换为映射的函数。

    var m map[string]string
    _, _ = conn.Do("HSET", "profile", "name", "yamada")
    _, _ = conn.Do("HSET", "profile", "age", "30")
    _, _ = conn.Do("HSET", "profile", "country", "america")
    m, _ = redis.StringMap(conn.Do("HGETALL", "profile"))
    fmt.Println(m) // map[name:yamada age:30 country:america]

    var p map[string]int
    _, _ = conn.Do("HSET", "cpu", "sys", "10")
    _, _ = conn.Do("HSET", "cpu", "usr", "20")
    _, _ = conn.Do("HSET", "cpu", "wai", "30")
    p, _ = redis.IntMap(conn.Do("HGETALL", "cpu"))
    fmt.Println(p) // map[usr:20 wai:30 sys:10]

转换为结构体

可以将HGETALL的结果转换为结构体。可以在结构体的定义中使用”redis”标签指定字段名,并将获取的结果Values传递给ScanStruct。

    var v []interface{}
    var p struct {
        Name    string `redis:"name"`
        Age     int    `redis:"age"`
        Country string `redis:"country"`
    }
    _, _ = conn.Do("HSET", "profile", "name", "yamada")
    _, _ = conn.Do("HSET", "profile", "age", "30")
    _, _ = conn.Do("HSET", "profile", "country", "america")
    v, _ = redis.Values(conn.Do("HGETALL", "profile"))
    _ = redis.ScanStruct(v, &p)
    fmt.Println(p) // {yamada 30 america}

结尾处

我看到了Redigo中各种实用函数的用法。

请参考

    • Redigoを使う(1) 基本的な使い方

 

    • Redigoを使う(2) 様々なデータ型を扱う

 

    • Redigoを使う(3) トランザクションを行う

 

    • Redigoを使う(4) コネクションプールを使う

 

    Redigoを使う(6) パブリッシュ/サブスクライブ
广告
将在 10 秒后关闭
bannerAds