从Redis/Golang客户端读取整个数据

从Redis/Golang客户端读取整个数据,go,redis,redis-cluster,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

我有一个充当缓存层的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)您可以使用KEYS命令获取所有密钥,然后访问每个密钥。但在某些情况下,这并不是一种推荐的方法,因为一大组缓存上的密钥会在Redis服务器中造成长时间阻塞。但若你们只有一个很小的缓存,那个么密钥就是你们可以使用的简单而优雅的命令


2) 您还可以使用HSET命令将相关键推送到散列中。因此,您可以使用HGETALL一次获取这些键值。这种方法可以帮助您的缓存变得美观。

通过使用EVAL运行Lua脚本来执行相同的操作,您可以将此操作减少到每个主控器一次往返。当然,这会在服务器运行时阻塞服务器,但是如果您的数据集太小,那么这可能不是问题。
SCAN
是执行此操作的推荐方法。其他选项,例如
将阻止Redis,直到检索到所有键。因为您使用的是Redis集群,所以在Redis中可能有许多键。如果不使用
SCAN
,您将在很长一段时间内阻止Redis。是
KEYS
从集群中检索所有密钥,还是仅从您当前所在的节点检索所有密钥?@Asalle
KEYS
始终返回所有密钥。所以这取决于你与什么通信。@Asalle-只有一个节点,这太随机了