Всем привет!
Идея LensDB родилась с простого поста моего друга. Он делился своим опытом создания Shared Memory кэша для своего пет-проекта на C#. В этом посте он написал:

Читая это, я задумался о том, как эффективна эта идея и почему бы не использовать её для создания более быстрого хранилища данных. сначала я подумал, что можно написать просто небольшую библиотеку для работы с байтами на Haskell, чтобы ускорить некоторые операции в своих проектах.
Но как только мы с другом обсудили идею, мне в голову пришла более амбициозная мысль: а что если сделать аналог Redis, но с использованием байтов и с максимальной оптимизацией для скорости и производительности? Вместо того, чтобы просто улучшить кэш, я захотел создать полноценную систему для хранения данных с таким же интерфейсом, как у Redis, но с учётом всех преимуществ работы с байтами.
Почему я решил сделать именно так?
После обсуждения с другом, а также на основе собственного опыта работы с данными, я понял, что использование низкоуровневых байтов вместо текстовых форматов, таких как JSON, может дать огромный прирост производительности.
В традиционных NoSQL‑системах, таких как Redis, данные передаются в виде строк или сериализованных объектов, что требует дополнительных операций на каждом запросе (парсинг, сериализация и т. д.). В результате это замедляет скорость работы и увеличивает использование памяти.
Что если можно сделать всё проще? Что если можно обрабатывать данные прямо как бинарные данные, без преобразования в текст и обратно? Это позволило бы:
в 30 раз большую скорость, чем Redis, при обработке определённых типов запросов.
меньше потребления памяти — данные занимают до 30% меньше места.
быстрее сериализация и десериализация данных благодаря использованию MemoryPack и работы с битами, что значительно снижает накладные расходы по сравнению с JSON.
После этого я понял, что вместо того, чтобы просто сделать улучшенный кэш, я могу создать аналог Redis, который будет работать намного быстрее, а при этом будет иметь тот же интерфейс и возможности, что и традиционные базы данных NoSQL.
Что такое LensDB?
LensDB — это проект, нацеленный на создание высокопроизводительного аналога Redis, который использует байтовые последовательности для хранения и передачи данных, а не текстовые форматы. это решение ориентировано на работу с высокими нагрузками, где критична скорость отклика и эффективность работы с памятью.
Основные особенности LensDB:
отказ от JSON и текстовых форматов: работа с данными происходит через сырые байты, что ускоряет операции и сокращает использование памяти
максимальная производительность: благодаря использованию MemoryPack и битовой сериализации, процесс сериализации и десериализации ускоряется в несколько раз по сравнению с традиционными подходами
простота и интеграция: LensDB сохраняет привычный интерфейс key-value и может быть легко интегрирован в существующие системы, но с гораздо большей производительностью
Почему я выбрал Haskell?
Для реализации LensDB я выбрал Haskell, потому что он идеально подходит для создания надёжных и высокопроизводительных систем. Haskell даёт возможность:
писать эффективный и безопасный код с минимальными накладными расходами
использовать параллелизм для обработки большого количества запросов одновременно
обеспечить максимальную производительность благодаря строгой системе типов и функциональному стилю
Haskell позволяет мне создавать системы с гарантированной безопасностью типов и высокой производительностью, что очень важно для создания базы данных с такими высокими требованиями к скорости и эффективности.
Что дальше?
Проект LensDB ещё находится на стадии разработки, и я активно работаю над улучшением функционала. Альфа‑версия уже доступна на GitHub, и я буду рад любым предложениям, багрепортам и pull‑request'ам.
Если вы хотите помочь в развитии проекта, пожалуйста, пишите issue или отправляйте PR. Ваши идеи и помощь будут крайне полезны для улучшения и доработки системы.
Ссылку на проект и его исходники можно найти здесь: GitHub.
LensDB — это не просто эксперимент. это попытка показать, как можно создать систему хранения данных с фокусом на высокую производительность и простоту интеграции, при этом значительно улучшив скорость и эффективность по сравнению с традиционными решениями, такими как Redis.
Если вам интересен этот проект, хотите поучаствовать или просто обсудить идеи — буду рад вашим комментариям и предложениям!
Комментарии (13)

Belvarm
07.01.2026 18:09Смотрели ли в сторону rocksdb? Интересно было бы сравнить

mentin
07.01.2026 18:09Тоже читал и пытался понять принципиальные отличия от RocksDB и прочих производных LevelDB.

CodWiz Автор
07.01.2026 18:09ну, проект находится в стадии разработки, в будущем он будет в разы удобнее и лучше, особенно для масштабных проектов или где нужно сохранять оптимизацию = работоспособность

faxenoff
07.01.2026 18:09Привет! Интересный прокет.
Вопросы:
TTL для записей есть? как реализован, если есть? Мне надо избавляться от старых записей без лишних телодвижений.
Как настраивается соотношение "в памяти" к "на диске"? Если в кубере запускать, то не надо заходить за лимиты.

CodWiz Автор
07.01.2026 18:09пока что нет ttl-реализации, но в дальнейшем, думаю, добавлю
контроль использования памяти/диска на уровне конфигурации есть частично (max_memory), но жёстких ограничений нет, это контролируется на уровне окружения (например, kubernetes)

inklesspen
07.01.2026 18:09В традиционных NoSQL‑системах, таких как Redis, данные передаются в виде строк или сериализованных объектов
Не передаю́тся, а МОГУТ передаваться, что часто и делается, но это не является ограничением. Здесь например туда решили класть msgpack - бинарный формат сообщений, и сохранили 50% памяти.
Dhwtj
Сделайте бенч
CodWiz Автор
это при альфе версии так, в будущем я думаю еще ускорить и оптимизировать
Dhwtj
В общем, не быстро: большой разброс и значительно медленнее хешмапы вроде dashmap (Rust). Причём, не похоже на время disk io.
Советы от LLM (ну, чем богаты...)
Проблема не в сериализации, а в:
Иммутабельность + STM = копирование всей структуры при каждой записи (даже с ByteString)
GC — видно по 98% outliers: каждая запись создаёт новые объекты, сборщик мусора "останавливает мир"
Data.Map = дерево с логарифмической сложностью и аллокациями на каждый узел
Я бы наоборот, взял dashmap и потихоньку шаг за шагом прикручивать сетевой io и персистентность
Dhwtj
Ну типа такого
А потом усложнял бы
Ожидаемые результаты на уровне Redis (100-200 kops/sec).
И затраты на сериализацию можно смотреть только если уже упёрлись в остальные ограничения.
P.S. код довольно кривой, только для объяснения базового алгоритма
gev
Судя по зависимостям так и есть ))) Вот на тему как раз
https://www.parsonsmatt.org/2025/12/17/the_subtle_footgun_of_tvar_(map____).html