2015-07-19 44 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 
    } 
}