如何使用redigo库从golang查询Redis数据库

huangapple go评论81阅读模式
英文:

How to query Redis db from golang using redigo library

问题

我正在尝试找出在一个命令中查询多个键的Redis数据库的最佳方法。
我看到了可以在redis-cli中使用MGET。但是,如果我要使用GO语言的redigo库,该如何做呢?假设我有一个键的数组,并且我想在一个查询中从Redis数据库中获取这些键的所有值。

谢谢!

英文:

I am trying to figure out what is the best way to query Redis db for multiple keys in one command.
I have seen MGET which can be used for redis-cli. But how you do that using redigo library from GOlang code. Imagine I have an array of keys and I want to take from Redis db all the values for those keys in one query.

Thanks in advance!

答案1

得分: 7

假设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 {
    // 处理错误
}
for _, v := range values {
   fmt.Println(v)
}

Go FAQ 解释了为什么需要复制键。规范描述了如何将切片传递给可变参数

英文:

Assuming that c is a Redigo connection and keys is a []string of your 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)
}

The Go FAQ explains why you need to copy the keys. The spec describes how to pass a slice to a variadic param.

答案2

得分: 6

func main() {
    // 连接到本地主机,确保 redis-server 在默认端口上运行
    conn, err := redis.Dial("tcp", ":6379")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 添加一些键
    if _, err = conn.Do("SET", "k1", "a"); err != nil {
        log.Fatal(err)
    }
    if _, err = conn.Do("SET", "k2", "b"); err != nil {
        log.Fatal(err)
    }
    // 为了好玩,我们让 k3 不存在

    // 在单个 MGET 中获取多个键,请求 redigo 返回 []string 结果
    strs, err := redis.Strings(conn.Do("MGET", "k1", "k2", "k3"))
    if err != nil {
        log.Fatal(err)
    }

    // 输出 [a b ]
    fmt.Println(strs)

    // 现在如果我们想要一些整数呢?
    if _, err = conn.Do("SET", "k4", "1"); err != nil {
        log.Fatal(err)
    }
    if _, err = conn.Do("SET", "k5", "2"); err != nil {
        log.Fatal(err)
    }

    // 获取这些键,但要求 redigo 给我们一个 []interface{}
    // (它没有一个 redis.Ints 助手函数)。
    vals, err := redis.Values(conn.Do("MGET", "k4", "k5", "k6"))
    if err != nil {
        log.Fatal(err)
    }

    // 将 []interface{} 切片扫描到一个 []int 切片中
    var ints []int
    if err = redis.ScanSlice(vals, &ints); err != nil {
        log.Fatal(err)
    }

    // 输出 [1 2 0]
    fmt.Println(ints)
}

**更新于 2015  3  10 **redigo 现在有一个 `redis.Ints` 助手函数
英文:

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)
}

UPDATE March 10th 2015: redigo now has a redis.Ints helper.

huangapple
  • 本文由 发表于 2014年10月13日 22:47:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/26342790.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定