从Redis / Golang客户端读取全部数据

I have a Redis deployment acting as a caching layer. The cache is not very big and we would like to read all the items (key/values) at once from our Golang program. The only solution I found is to iterate through all master servers (it is a Redis cluster), execute a Scan to get all the keys and then iterate the keys to get the values.

err := cch.client.ForEachMaster(func(cl *redis.Client) error {
    wg.Add(1)
    defer wg.Done()
    var cursor uint64
    var n int
    numFor := 0
    for {

        var keys []string
        var err error
        keys, cursor, err = cl.Scan(cursor, "*", 10).Result()
        if err != nil {
            panic(err)
        }
        n += len(keys)

        for _, keyval := range keys {
            var cont Content
            if err := cch.items.Get(keyval, &cont); err == nil {

            } else {
                log.Warnf("Error getting Key %s from cache: %s from master %s", keyval, err)
            }
        }

        if cursor == 0 {
            break
        }
    }
    return nil
})
wg.Wait()

Is there a better way to do this? Cannot believe I need so many roundtrips to Redis to get the values. Thanks!

1) You can use KEYS command to get all the keys and then access every key. But that is not a recommended way in some cases since KEYS upon a big set of cache will cause long-blocking in Redis server. But if you just have a tiny cache, KEYS is simple and elegant command you can use.

2) You can also push the relevant keys into a hash using HSET command. So you can use HGETALL to get those key-values at once. This way can help your cache to become good-looking.