Закрепляем материал модуля: шесть заданий, где вы собственными руками увидите однопоточность, кодировки, сложность команд и поведение памяти.
Задание 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)-команд на коллекциях
- Создайте set на 1 000 000 элементов (скрипт с SADD пайплайном).
- Замерьте
SMEMBERSпо времени (например,time redis-cli SMEMBERS set > /dev/null). - Замерьте тот же объём через SSCAN COUNT 1000.
- Удалите сет через
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.