Программа курса

Модуль 01 / Урок 5 из 27

Практикум модуля 1

Теория и практика

Закрепляем материал модуля: шесть заданий, где вы собственными руками увидите однопоточность, кодировки, сложность команд и поведение памяти.

Задание 1. Лаборатория кодировок

Выполните серию команд и запишите, как меняется кодировка:

SET s1 42                       # ?
SET s2 "короткая"               # ?
SET s3 "<80-байтная строка aaa...>"   # ?
HSET h1 a 1 b 2                 # ?
HSET h1 f1 v1 ... f130 v130     # ? (после 128 полей)
SADD set1 1 2 3                 # ? intset
SADD set1 "hello"               # ? hashtable
ZADD z1 1 a 2 b                 # ?
# Проверяйте: OBJECT ENCODING ключ

Цель: уметь по кодировке предсказать стоимость операций и потребление памяти.

Задание 2. Хеш против отдельных ключей

Скриптом создайте 10 000 объектов двумя способами и сравните INFO memory:

  • Вариант А: SET user:{i}:name n{i}, SET user:{i}:age {20+i%30} — 20 000 ключей;
  • Вариант Б: HSET user:{i} name n{i} age {20+i%30} — 10 000 хешей.

Зафиксируйте разницу used_memory — обычно она в разы в пользу хешей.

Задание 3. Ощутить однопоточность

# Терминал 1: залейте 2 млн ключей
redis-benchmark -n 2000000 -t set -d 8 -q
# Терминал 2: во время KEYS в терминале 1 постоянно меряйте
redis-cli --latency
# Терминал 1:
redis-cli KEYS '*'

Затем повторите с обходом SCAN'ом по 1000 за вызов и сравните график латентности.

Задание 4. Стоимость O(N)-команд на коллекциях

  1. Создайте set на 1 000 000 элементов (скрипт с SADD пайплайном).
  2. Замерьте SMEMBERS по времени (например, time redis-cli SMEMBERS set > /dev/null).
  3. Замерьте тот же объём через SSCAN COUNT 1000.
  4. Удалите сет через DEL, затем пересоздайте и удалите через UNLINK — сравните паузы.

Задание 5. Память: накладные расходы

SET tiny a
MEMORY USAGE tiny
~56   # ~50 байт на "пустой" ключ: словарь, robj, SDS-заголовок

Посчитайте: сколько займут 10 млн коротких ключей только за счёт накладных расходов? Сравните с реальностью, занеся их benchmark'ом. Этот расчёт — основа capacity planning из модуля 2.

Задание 6 (со звёздочкой). Маленький дизастер-репорт

Опишите словами (или в комментариях к коду) сценарий: «в проде раз в час Redis отвечает с паузой 300 мс; датасет 8 ГБ; save-правила 900/1, 300/10, 60/10000». Какие три гипотезы вы проверите первыми и какими командами? Сохраните ответ — вернёмся к нему в модуле 6.

Ответы-подсказки

Задание 1: int; embstr; raw; listpack; hashtable (после превышения 128 полей); intset; hashtable; listpack.

Задание 5: 10 млн × ~56 байт ≈ 560 МБ «воздуха» только на существование ключей — ключи не бесплатны.

Задание 6: 1) BGSAVE-форк по расписанию (INFO persistence → latest_fork_usec); 2) O(N)-команды (SLOWLOG GET); 3) истечение больших пачек TTL-ключей (latency monitor). Разберём подробно в 6.2.