Redigo: Support for SCAN/SSCAN/ZSCAN/HSCAN commands

Created on 21 Sep 2014  路  4Comments  路  Source: gomodule/redigo

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.

Most helpful comment

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
    }
}

All 4 comments

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
    }
}
Was this page helpful?
0 / 5 - 0 ratings

Related issues

garyburd picture garyburd  路  23Comments

Wang-Kai picture Wang-Kai  路  4Comments

smotes picture smotes  路  18Comments

samwhitecoull picture samwhitecoull  路  3Comments

Serhioromano picture Serhioromano  路  7Comments