Skip to main content

Як Redis зберігає тип значення під капотом?

Чудове питання - це якраз те, що робить Redis не просто "ключ-значення", а високопродуктивним об'єктним сховищем у пам'яті. Під капотом Redis зберігає всі дані як об'єкти, кожен з яких має тип, кодування й допоміжну метаінформацію.

Розберемо детально:

1. Кожне значення - це RedisObject

Внутрішньо Redis не просто зберігає "значення", а створює структуру типу:

c
typedef struct redisObject { unsigned type:4; // тип (string, list, hash, set, zset тощо) unsigned encoding:4; // спосіб зберігання (raw, int, ziplist тощо) void *ptr; // вказівник на реальні дані int refcount; // лічильник посилань ... } robj;

Підсумок: Redis знає, який це тип даних і як саме він зберігається (у якій структурі пам'яті).

2. type - логічний тип даних

Поле type визначає яка це структура на рівні API Redis:

  • REDIS_STRING
  • REDIS_LIST
  • REDIS_SET
  • REDIS_ZSET
  • REDIS_HASH

Команди Redis (GET, HGETALL, ZADD тощо) використовують це поле, щоб розуміти, які операції допустимі.

3. encoding - фізичне представлення

Це спосіб, як саме дані розміщуються в пам'яті. Redis динамічно обирає оптимальне кодування залежно від розміру й структури даних.

Приклади:

Тип данихМожливі кодуванняОпис
Stringint, embstr, rawЧисло, короткий рядок (в об'єкті), довгий рядок (у виділеній пам'яті)
ListquicklistКомпресований список вузлів
Setintset, hashtableМножина чисел чи повноцінна хеш-таблиця
Hashziplist (до Redis 6) → listpackКомпактне зберігання пар "ключ-значення"
Sorted Setziplist / skiplistУщільнена структура чи збалансований список
StreamlistpackПослідовність записів з ID і полями

Redis автоматично перемикається між кодуваннями: наприклад, маленький Hash зберігається як компактний listpack, а при рості - перетворюється на повноцінну hashtable.

4. Оптимізація пам'яті

Redis застосовує низку технік для зменшення overhead:

  • Shared integers: маленькі числа (0-9999) зберігаються як спільні об'єкти.
  • SDS (Simple Dynamic String): рядки реалізовані з метаданими (довжина, буфер, місткість).
  • Compact structures: listpack, ziplist і intset зберігають елементи поспіль в одному блоці пам'яті.

Результат: менше накладних витрат, швидше виділення й звільнення пам'яті.

5. Тип значення відомий миттєво

Redis не робить перевірок "на льоту" - тип і кодування відомі одразу за об'єктом. Тому команди на кшталт GET чи HGETALL виконуються за O(1), без додаткових перетворень.

6. Приклад у дії

Коли ти виконуєш:

bash
SET age 30

Redis:

  • створює ключ age (String),
  • бачить, що значення - число,
  • зберігає його як об'єкт з type = REDIS_STRING, encoding = int, ptr = 30.

Якщо потім зробити:

bash
SET description "long text about user ..."

type = REDIS_STRING, але encoding = raw, оскільки це вже рядок, не число.

Підсумок

Під капотом Redis зберігає кожне значення як об'єкт (RedisObject), у якому вказано:

  • тип даних (string, hash, list …),
  • кодування зберігання (int, ziplist, hashtable …),
  • вказівник на вміст.

Завдяки цьому Redis уміє автоматично обирати оптимальне представлення й працювати з пам'яттю максимально ефективно - швидко, компактно й передбачувано.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.