это будет использовать сотни ГБ памяти.Кажется ли это правильным?
ДА
Поддерживает ли Redis 300 ГБ для одного экземпляра?
ДА
Есть ли лучший способ, которым я могу сделать это?
Вы можете попробовать следующие методы:
Избегайте использования хэша
Поскольку вы всегда получаете все поляжурнал с HGETALL
, нет необходимости сохранять журнал как HASH
.HASH
использует больше памяти, чем STRING
.
Вы можете сериализовать все поля в строку и сохранить журнал как пару ключ-значение:
SET 'statistics:a5ded391ce974a1b9a86aa5322ea9e90' '{xbi: 1, bid: 0.24024, and other fields}'
@ Sripathi Krishnan's answerдает еще один способ избежать HASH
, т.е. настроить Redis для кодирования HASH
в ZIPLIST
.Это хорошая идея, если вы не делитесь своим Redis с другими приложениями.В противном случае это изменение может вызвать проблемы у других.
Сжать данные
Чтобы уменьшить использование памяти, вы можете попробовать сжать ваши данные.Redis может хранить двоичные строки, так что вы можете использовать gzip, snappy или другой алгоритм сжатия, чтобы сжать текст журнала в двоичную строку и сохранить его в Redis.
Обычно, вы можете получить лучшее сжатие, когда ввод больше,Поэтому лучше сжать весь журнал, а не сжимать каждое поле одно за другим.
Побочным эффектом является то, что производителю и потребителю журнала необходимо затратить некоторый процессор для сжатия и распаковки данных.Тем не менее, обычно это НЕ проблема, а также это может снизить пропускную способность сети.
Пакетная запись и пакетное чтение
Как я уже говорил выше, если вы хотите получить лучшее сжатие, вы должны получитьбольший вклад.Поэтому, если вы можете написать несколько журналов в пакете, вы можете сжать пакет журналов, чтобы получить лучшее сжатие.
- Сжать несколько журналов в пакет:
compress(log1, log2, log3) -> batch1: batch-result
- ПоместитеРезультат партии в Redis в виде пары ключ-значение:
SET batch1 batch-result
- Создание индекса для партии:
MSET log1 batch1 log2 batch1 log3 batch1
Когда вам нужно получить журнал:
- Поиск в индексе для получения ключа пакета:
GET log1
-> batch1 - Получение результата пакета:
GET batch1
-> результат партии - Распаковка результата партиии найдите журнал по результатам
Последний метод является наиболее сложным, и дополнительный индекс будет стоить дополнительной памяти.Однако это может в значительной степени уменьшить размер ваших данных.
Кроме того, что эти методы могут достичь, в значительной степени зависит от вашего журнала.Вы должны сделать много тестов:)