OwnDB - собственная реализация key=value базы данных.
База данных в своей реализации имеет две стороны: сервер и клиент, которые соединены по TCP.
Хранение данных осуществляется в бинарном формате, то есть каждый из поддерживаемых на данный момент форматов данных, представляется и сохраняется в бинарном файле. При запуске сервера бинарник проходит этап десериализации и сохраняет данные в рантайме, то есть в мапе.
Все механизмы сериализации и десериализации написаны самостоятельно.
Используется достаточно примитивный вариант хранения данных - TLV.
TLV - абревиатура порядка хранения данных, в нашем случае это TYPE (тип данных, который мы десериализуем) представлен одним байтом, LENGTH (длина данных, так мы понимаем сколько байт нам нужно читать дальше и через сколько байт начинается новая структура) представлена двумя байтами, VALUE (сами данные, после которых идет точно такая же структура) представлено LENGTH байтами
что делать, ведь при перезапуске сервера данные будут потеряны?
на этот случай предусмотрен механизм WAL.
WAL (Write-Ahead Logging) - это метод обеспечения целостности данных, который использует логгирование запросов перед их применением. При ошибке или внезапной остановке сервера все запросы будут восстановлены и выполнены на последний снэпшот данных для того, чтобы восстановить все данные.
Тут все просто, по TCP клиент подключается к серверу и отправляет запрос, который написал пользователь. Но вот тут уже интереснее.
В данной реализации написан DSL.
Можно замахнуться и сказать, что был разработан свой просто, но все же, язык программирования! ну почти..
DSL (Domain-Specific Language) - это специализированный язык программирования, который разрабатывается для решения каких то узконаправленных задач, к примеру, всеми любимый SQL.
А еще этот язык программирования имеет типы данных, которые используются для оптимизации сериализации и десериализации данных.
Что умеет этот чудо ЯП?
- Запись данных без типов (стринг по умолчанию)
SET key = 'value'- Запись данных, используя тип данных
SET STRING key = 'value'
--- ответ сервера
OK! 1.7119msТипы данных, которые поддерживаются на данный момент:
- STRING
SET STRING foo = 'bar';- INT
SET INT foo = 123;- FLOAT
SET FLOAT foo = 1.23;- BOOL
SET BOOL foo = FALSE;
- Получение данных
GET key;
--- ответ сервера
value- Удаление данных
RM key;
--- ответ сервера
OK! 0s
--- пробуем еще раз получить данные
GET key;
--- ответ сервера
undefined key: "key"- Получение всех доступных ключей
KEYS;
--- ответ сервера
"foobar"; "foo"; "fo";- Сохранение данных из WAL в бинарь
SAVE;- Клонируем репозиторий
git clone https://github.com/algrvvv/owndb.git- Создаем свой конфигурационный файл
cp config.example.yml config.yml- Меняем конфигурацию под себя
- Запускаем сервер
go run cmd/db/main.go --config config.yml- Запускаем клиента
go run cmd/cli/main.go --config config.ymlБуду рад любому вашему фидбеку, только добра!
