如何使用golang使用golang从redis扫描密钥" SCAN"不是" KEYS"

时间:2015-07-19 05:30:52

标签: go redis

这是我的代码

redisPool := redis.NewPool(func() (redis.Conn, error) {
        con, err := redis.Dial("tcp", *redisAddress)
        con.Do("SELECT", 0)
        if err != nil {
            return nil, err
        }
        return con, err
    }, *maxConnections)
    fmt.Println("Redis Connection Establ...!")
    con := redisPool.Get()
    data, err1 := con.Do("scan", "0")
    //data, err1 := con.Do("KEYS", "*")
    if err1 != nil {
        fmt.Println(err1)
    } else {
        fmt.Println(reflect.TypeOf(data))
        fmt.Println(data)
    }

我的输出不是字符串

1 个答案:

答案 0 :(得分:11)

关于SCAN命令的事情是它不仅返回一堆键,而且它返回一个“迭代器”号,你应该在下次调用SCAN时放入它。所以答复的结构可以看作是

[ iterator, [k1, k2, ... k10] ]

首先拨打SCAN 0,然后在连续通话中拨打SCAN <iterator>

使用redigo执行此操作就像这样(我的错误处理不正确,但这只是为了表明这个想法):

// here we'll store our iterator value
iter := 0

// this will store the keys of each iteration
var keys []string
for {

    // we scan with our iter offset, starting at 0
    if arr, err := redis.MultiBulk(conn.Do("SCAN", iter)); err != nil {
        panic(err)
    } else {

        // now we get the iter and the keys from the multi-bulk reply
        iter, _ = redis.Int(arr[0], nil)
        keys, _ = redis.Strings(arr[1], nil)
    }

    fmt.Println(keys)

    // check if we need to stop...
    if iter == 0  {
        break
    }
}