这是我的代码
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 :(得分: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
}
}