Как правильно рассчитать hash-max-ziplist-value? - PullRequest
0 голосов
/ 05 июня 2019

Пример моего вопроса: HMSET myhash field1 value1 field2 value2, а в myhash есть только эти два поля.

Основной вопрос заключается в том, как рассчитать hash-max-ziplist-value, чтобы мой хэш не превышал значение, чтобы сохранить мой хэш в сжатом формате, чтобы минимизировать использование памяти.

Большое спасибо «Кевину Кристоферу Генри» за подробное объяснение, помощь и время. Из-за моего ограниченного английского я приведу здесь ответ Кевина. Пожалуйста, поправьте меня, если я правильно понял.

(1) Чтобы встретить hash-max-ziplist-value, мне нужно вычислить max (field1, value1, field2, value2). Давайте предположим, что value1 имеет самый большой размер. Тогда мне просто нужно убедиться, что размер value1 не превышает hash-max-ziplist-value.

(2) Чтобы вычислить value1, мне просто нужно вычислить количество байтов в размере. Потому что hash-max-ziplist-value - это число байтов для строкового значения перед любым сжатием.

(3) Чтобы вычислить количество байтов для value1, существует много способов, и один из них выглядит следующим образом: Во-первых, преобразуйте кодировку value1 в кодировку UTF8, если это не так. Во-вторых, проверьте его длину, используя язык клиента. Потому что длина строки в кодировке UTF8 - это количество байтов в формате Size. (например: utf8.encode(value1).length).

Оригинальный пост

Например, HMSET myhash field1 value1 field2 value2

  • Сначала я хочу уточнить, что на самом деле означает hash-max-ziplist-entries 1035 *.

В приведенном выше примере это одна запись или две записи, поскольку она имеет два поля?

  • Что такое hash-max-ziplist-value? Это размер в байтах для

(а) MEMORY USAGE myhash

(б) размер суммы field1, value1, field2, value2

(c) сумма суммы value1 и value2.

(д) макс (value1, value2)?

(e) max (field1 + value1, field2 + value2)

  • Я не знаю, как я могу вычислить мое значение хеша, чтобы соответствовать hash-max-ziplist-value. hash-max-ziplist-value количество байтов в размере? Это длина строки в кодировке utf-8? Есть ли в Redis команда для этого расчета?

Большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 05 июня 2019

Эти значения кратко описаны в файле redis.conf, а также в документации по оптимизации памяти .

# Хэши кодируются с использованием структуры данных с эффективным использованием памяти, когда они имеют
# небольшое количество записей, а самая большая запись не превышает заданную
# порог. Эти пороговые значения можно настроить с помощью следующих директив.
hash-max-ziplist-records 512
hash-max-ziplist-value 64

Используя эти значения по умолчанию в качестве примера, если хеш содержит 512 или менее записей, а каждая имеет размер 64 байта или меньше, хэш будет закодирован с использованием ziplist.

Хотя в документации не указано, как именно рассчитывается размер записи хеша, посмотрите на исходный код , указывающий, что как имя поля, так и значение должны иметь размер, меньший или равный до порога. Вы должны быть в состоянии определить размер, рассчитав длину в байтах двоичной строки.

Чтобы ответить на некоторые ваши конкретные вопросы:

В приведенном выше примере это одна запись или две записи, потому что в ней два поля?

Two.

Что такое hash-max-ziplist-value?

Используя вашу терминологию, это будет max(field1, value1, field2, value2).

Это вычисление строки в кодировке utf-8?

Redis работает с двоичными строками. Вам (или вашему клиенту) решать, какую кодировку использовать.

Есть ли простой способ вычислить значение myhash в байтах для hash-max-ziplist-value? Есть ли в Redis команда для этого расчета?

Не то, что я знаю, но длина двоичного строкового представления значения должна быть приблизительно правильной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...