2015-07-19 144 views
4

这是我的代码如何扫描使用golang使用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) 
    } 

我的输出没有在字符串来

+0

您的代码段为我工作。它在第一次迭代中打印了一堆密钥。 – Nadh

回答

8

有关扫描命令的事情是,它不只是返回一堆密钥,而且还会返回一个“迭代器”号码,您应该在下次调用SCAN时将其输入。所以回复的结构可以通过调用SCAN 0并在需要调用SCAN <iterator>连续通话被视为

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

你开始。

这样做可以使用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 
    } 
}