如何使用golang使用"扫描"而非"密钥"从redis扫描密钥

Pra*_*kar 5 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)
    }
Run Code Online (Sandbox Code Playgroud)

我的输出不是字符串

Not*_*fer 13

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

[ iterator, [k1, k2, ... k10] ]
Run Code Online (Sandbox Code Playgroud)

您可以通过呼叫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
    }
}
Run Code Online (Sandbox Code Playgroud)