Skip to content

Latest commit

 

History

33 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

key-value-storage

Реализация in-memory key-value хранилища на C++ с персистентностью и TCP-сервером - упрощённая версия Redis, написанная с нуля без внешних библиотек.

Архитектура

┌────────────┐
│   Server   │  TCP-сервер, по потоку на клиента
└─────┬──────┘
      │
┌─────▼──────┐
│  KVEngine  │  Потокобезопасная точка входа (shared_mutex)
└─────┬──────┘
      │
  ┌───┴────┐
  │        │
┌─▼───┐  ┌──▼──┐
│ LRU │  │ WAL │  Персистентность: лог операций + снапшоты
│Cache│  └─────┘
└─┬───┘
  │
┌─▼─────┐
│HashMap│  Open addressing, linear probing, TTL на ячейку
└───────┘
  • HashMap — своя хеш-таблица с открытой адресацией (linear probing), tombstone-удалением и автоматическим рехешем при заполнении ≥75%.
  • LRUCache — обёртка над HashMap с вытеснением по давности использования (список порядка + O(1) доступ).
  • WAL (Write-Ahead Log) — текстовый журнал операций SET/DEL; при старте восстанавливает состояние через replay(). Каждые 100 операций делает снапшот текущего состояния и обрезает лог.
  • KVEngine — потокобезопасная обёртка над LRUCache + WAL (std::shared_mutex: параллельные чтения, эксклюзивная запись).
  • Server — TCP-сервер на сырых сокетах POSIX, на каждое подключение поднимает std::thread.

Возможности

  • SET key value [ttl] — сохранить значение, опционально с TTL в секундах
  • GET key — получить значение
  • DEL key — удалить ключ
  • EXISTS key — проверить наличие ключа
  • TTL (время жизни ключа) на уровне отдельной записи
  • LRU-вытеснение при превышении ёмкости кэша
  • Восстановление состояния после рестарта через WAL + снапшоты

Сборка

Зависимостей, кроме стандартной библиотеки C++17, POSIX-сокетов и thread, нет.

Через CMake

mkdir build
cd build
cmake ..
make

Запуск

./kvserver

Примеры работы

Соединение обрабатывает ровно одну команду за раз (без multiplexing и без keep-alive): клиент отправляет строку, получает ответ, соединение закрывается.

Пример через netcat / /dev/tcp:

$ echo -n "SET foo bar" | nc 127.0.0.1 6380
OK

$ echo -n "GET foo" | nc 127.0.0.1 6380
bar

$ echo -n "SET session data 60" | nc 127.0.0.1 6380   # TTL = 60 секунд
OK

$ echo -n "EXISTS foo" | nc 127.0.0.1 6380
1

$ echo -n "DEL foo" | nc 127.0.0.1 6380
OK

Ответ на несуществующий ключ: (Key not found).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages