It does not appear that Do returns all the data for SCAN. http://redis.io/commands/scan
I get two []interface{} correctly, but the second one only contains integers 0-9, not the corresponding string results.
Do does handle the SCAN command correctly. Can you show your code?
iter := "0"
for {
result, err := rcon.Do("SCAN", iter, "MATCH", "test:*")
if err != nil {
log.Fatalln(err)
}
scanResults, ok := result.([]interface{})
if !ok || len(scanResults != 2) {
log.Fatalln("Cannot cast scan results")
}
if b, ok := scanResults[0].([]byte); !ok || string(b) == "0" {
log.Println("Done fetching keys")
break;
} else {
iter = string(b)
}
keys, ok := scanResults[1].([]interface{})
if !ok {
log.Fatalln("Cannot cast scan results")
}
for key := range keys {
//I expect strings (keys) here, I get ints
log.Printf("%T %v\n", key, key)
}
}
If there's an easier/better way to implement a SCAN, please let me know! Thanks
Duh, sorry, stupid mistake...
for _, key := range keys {
b, ok := key.([]byte);
if !ok {
log.Fatalln("Cannot cast key")
}
log.Println(string(b))
}
works fine!
IMHO, a much cleaner approach:
var (
cursor int64
items []string
)
results := make([]string, 0)
for {
values, err := redis.Values(conn.Do("SSCAN", key, cursor))
if err != nil {
return
}
values, err = redis.Scan(values, &cursor, &items)
if err != nil {
return
}
results = append(results, items)
if cursor == 0 {
break
}
}
Most helpful comment
IMHO, a much cleaner approach: