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

时间:2018-08-28 00:14:01

标签: go redis redis-cluster

我有一个Redis部署充当缓存层。缓存不是很大,我们想从Golang程序中一次读取所有项目(键/值)。我发现的唯一解决方案是遍历所有主服务器(它是Redis群集),执行扫描以获取所有键,然后迭代键以获取值。

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()

有更好的方法吗?不敢相信我需要往返Redis这么多次才能获得这些价值。谢谢!

1 个答案:

答案 0 :(得分:2)

1)您可以使用KEYS命令获取所有密钥,然后访问每个密钥。但是在某些情况下不建议这样做,因为大量缓存上的KEYS将导致Redis服务器中的长时间阻塞。但是,如果您只有一个很小的缓存,则可以使用KEYS简单而优雅的命令。

2)您还可以使用HSET命令将相关键推入哈希值。因此,您可以使用HGETALL一次获取那些键值。这样可以帮助您的缓存变得美观。