TGViewer
C++ Academy C++ Academy @cpluspluc · 15.5K subscribers
Post #1542 2.91K
Redis не доверяет обычным строкам C - и вот почему

В C строка заканчивается нулевым байтом \0. Из-за этого strlen() каждый раз проходит весь буфер, а хранить произвольные бинарные данные становится неудобно.

Поэтому Redis использует собственную структуру SDS — Simple Dynamic Strings.

В памяти она выглядит примерно так:


[len][alloc][flags][данные...\0]

sds


Перед самими данными Redis хранит метаданные:

- len — текущую длину;
- alloc — размер выделенной памяти;
- flags — тип заголовка.

Благодаря этому длина строки определяется за O(1), а свободное место известно заранее. При добавлении данных Redis не обязан каждый раз заново вычислять размер и перевыделять память.

SDS также остаётся совместимой со многими функциями C: указатель ведёт прямо на буфер, а в конце всё равно находится \0.

Но Redis не зависит от этого терминатора — длина хранится отдельно. Поэтому внутри строки могут находиться нулевые байты, изображения, сериализованные объекты и другие бинарные данные.

Важный нюанс: структура sdshdr из старых примеров сегодня упрощена. Современный Redis выбирает компактный заголовок sdshdr5, sdshdr8, sdshdr16, sdshdr32 или sdshdr64 в зависимости от размера строки.

Небольшой заголовок перед буфером решил сразу три проблемы: быстрое получение длины, безопасную работу с бинарными данными и эффективное расширение строк.

Источник:
https://redis.io/docs/latest/operate/oss_and_stack/reference/internals/internals-sds/
https://github.com/redis/redis/blob/unstable/src/sds.h
  • ❤ 7
  • 👍 5
  • 🔥 2
More from @cpluspluc
  1. Sep 18, 2026Как посчитать миллиарды уникальных значений, используя всего несколько килобайт памяти Для…
  2. Sep 17, 2026⚙️ useful_abstractions - вычисления на этапе компиляции в C++23 Библиотека упрощает работу…
  3. Sep 17, 2026Разница между C++ и Python
  4. Sep 17, 2026«Я про бэкенд»: как устроены AI-системы под капотом бигтеха 🗓 3 октября, Москва и онлайн…
  5. Sep 16, 2026💡 Алгоритм Флойда находит цикл в связном списке всего с двумя указателями и `O(1)` дополн…
  6. Sep 16, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →