Чтение всех данных из клиента Redis / Golang

У меня есть развертывание 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, чтобы получить значения. Спасибо!


person OCDev    schedule 28.08.2018    source источник
comment
Вы можете сократить это до одного кругового обхода на мастер, используя EVAL для запуска сценария Lua, чтобы сделать то же самое. Конечно, это заблокирует сервер, пока это происходит, но если ваш набор данных действительно настолько мал, то, возможно, это не проблема.   -  person Kevin Christopher Henry    schedule 28.08.2018
comment
SCAN — рекомендуемый способ выполнения работы. Другие варианты, например. KEYS заблокирует Redis до тех пор, пока не будут получены все ключи. Поскольку вы используете Redis Cluster, у вас может быть много ключей в Redis. Если не использовать SCAN, вы надолго заблокируете Redis.   -  person for_stack    schedule 28.08.2018


Ответы (1)


1) Вы можете использовать команду KEYS, чтобы получить все ключи, а затем получить доступ к каждому ключу. Но в некоторых случаях это не рекомендуется, поскольку KEYS при большом наборе кеша вызовет длительную блокировку на сервере Redis. Но если у вас просто крошечный кеш, KEYS — это простая и элегантная команда, которую вы можете использовать.

2) Вы также можете поместить соответствующие ключи в хэш с помощью команды HSET. Таким образом, вы можете использовать HGETALL, чтобы сразу получить эти ключи-значения. Таким образом, ваш кеш может стать красивым.

person pfctgeorge    schedule 28.08.2018
comment
Получает ли KEYS все ключи из кластера или только тот узел, в котором вы сейчас находитесь? - person Asalle; 05.04.2019
comment
@Asalle KEYS всегда возвращает все ключи. Так что все зависит от того, с чем вы общаетесь. - person pfctgeorge; 07.04.2019
comment
@Asalle - только один узел, слишком случайно - person lumos42; 24.04.2020