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

标签 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) 您可以使用 KEYS 命令获取所有 key ,然后访问每个 key 。但在某些情况下,这不是推荐的方式,因为大量缓存上的 KEYS 会导致 Redis 服务器长时间阻塞。但如果您只有一个小缓存,KEYS 是您可以使用的简单而优雅的命令。

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

关于go - 从 Redis/Golang 客户端读取整个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52048446/

相关文章:

html - 转到调用 t.Execute 中的许多参数

redis - 使用 JMeter(使用 redis-dataset 插件)用 redis 哈希命中 redis 服务器

algorithm - 低延迟分布在内存 HashMap (计数映射)中

amazon-web-services - 我们如何在 aws elasticache redis-cluster 中查看哪些节点是主节点或副本节点?

node.js - 关于微服务架构的问题

go - 请解释 golang 类型是否按值传递

c# - 将 StackExchange.Redis 客户端与 Redis 集群一起使用

redis - 如何在连接 Redis 集群时在 jedis 中启用 TLS

ajax - 如何在 GAE GO 中实现 AJAX

caching - redis在django-rest-framework中的get方法