【问题标题】:How to query Redis db from golang using redigo library如何使用 redigo 库从 golang 查询 Redis db
【发布时间】:2015-03-11 05:15:34
【问题描述】:

我试图找出在一个命令中查询 Redis db 的多个键的最佳方法是什么。 我见过可以用于 redis-cli 的 MGET。但是你如何使用来自 GOlang 代码的 redigo 库来做到这一点。想象一下,我有一个键数组,我想在一个查询中从 Redis db 中获取这些键的所有值。

提前致谢!

【问题讨论】:

    标签: go redis redigo


    【解决方案1】:

    假设 c 是 Redigo 连接,keys 是您的密钥的 [] 字符串:

    var args []interface{}
    for _, k := range keys {
        args = append(args, k)
    }
    values, err := redis.Strings(c.Do("MGET", args...))
    if err != nil {
        // handle error
    }
    for _, v := range values {
       fmt.Println(v)
    }
    

    Go 常见问题解答explains why you need to copy the keys。该规范描述了如何pass a slice to a variadic param

    【讨论】:

    • 注意如果key不存在,redigo会返回一个空字符串——这是因为nil不能转换成字符串。
    • 如果应用程序必须区分nil和空字符串,应用程序应该使用redis.Values()而不是redis.Strings。
    【解决方案2】:

    http://play.golang.org/p/FJazj_PuCq

    func main() {
        // connect to localhost, make sure to have redis-server running on the default port
        conn, err := redis.Dial("tcp", ":6379")
        if err != nil {
            log.Fatal(err)
        }
        defer conn.Close()
    
        // add some keys
        if _, err = conn.Do("SET", "k1", "a"); err != nil {
            log.Fatal(err)
        }
        if _, err = conn.Do("SET", "k2", "b"); err != nil {
            log.Fatal(err)
        }
        // for fun, let's leave k3 non-existing
    
        // get many keys in a single MGET, ask redigo for []string result
        strs, err := redis.Strings(conn.Do("MGET", "k1", "k2", "k3"))
        if err != nil {
            log.Fatal(err)
        }
    
        // prints [a b ]
        fmt.Println(strs)
    
        // now what if we want some integers instead?
        if _, err = conn.Do("SET", "k4", "1"); err != nil {
            log.Fatal(err)
        }
        if _, err = conn.Do("SET", "k5", "2"); err != nil {
            log.Fatal(err)
        }
    
        // get the keys, but ask redigo to give us a []interface{}
        // (it doesn't have a redis.Ints helper).
        vals, err := redis.Values(conn.Do("MGET", "k4", "k5", "k6"))
        if err != nil {
            log.Fatal(err)
        }
    
        // scan the []interface{} slice into a []int slice
        var ints []int
        if err = redis.ScanSlice(vals, &ints); err != nil {
            log.Fatal(err)
        }
    
        // prints [1 2 0]
        fmt.Println(ints)
    }
    

    2015 年 3 月 10 日更新:redigo 现在有一个 redis.Ints 助手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多