У меня есть развертывание 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, чтобы получить значения. Спасибо!
SCAN
— рекомендуемый способ выполнения работы. Другие варианты, например.KEYS
заблокирует Redis до тех пор, пока не будут получены все ключи. Поскольку вы используете Redis Cluster, у вас может быть много ключей в Redis. Если не использоватьSCAN
, вы надолго заблокируете Redis. - person for_stack   schedule 28.08.2018