从 Redis / Golang 客户端读取整个数据
Reading entire data from Redis / Golang client
我有一个用作缓存层的 Redis 部署。缓存不是很大,我们想从我们的 Golang 程序中一次读取所有项目 (key/values)。我找到的唯一解决方案是遍历所有主服务器(它是一个 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 命令获取所有的密钥,然后访问每个密钥。但在某些情况下,这不是推荐的方式,因为大量缓存上的 KEYS 会导致 Redis 服务器长时间阻塞。但是如果你只有一个很小的缓存,KEYS 是你可以使用的简单而优雅的命令。
2) 您还可以使用 HSET 命令将相关密钥推送到哈希中。因此,您可以使用 HGETALL 一次获取这些键值。这样可以让你的缓存变得好看
我有一个用作缓存层的 Redis 部署。缓存不是很大,我们想从我们的 Golang 程序中一次读取所有项目 (key/values)。我找到的唯一解决方案是遍历所有主服务器(它是一个 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 命令获取所有的密钥,然后访问每个密钥。但在某些情况下,这不是推荐的方式,因为大量缓存上的 KEYS 会导致 Redis 服务器长时间阻塞。但是如果你只有一个很小的缓存,KEYS 是你可以使用的简单而优雅的命令。
2) 您还可以使用 HSET 命令将相关密钥推送到哈希中。因此,您可以使用 HGETALL 一次获取这些键值。这样可以让你的缓存变得好看