Необхідно реалізувати простий аналог memcached серевера, який приймає наступні команди:
- get (key);
- set (key, value, expires?) (з можливістю, опціонально, задати період зберігання записів у секундах, по замовчуванню період зберігання не обмежений)
- delete (key).
Сервер повинен вміти обслуговувати одночасно кількох клієнтів (паралельно). У одній сесії клієнт може виконувати кілька запитів. Дані зберігати у пам'яті та у файлі, доступ до якого відбувається через mmap. По сигналу USR1 створювати файл у /tmp зі списком записів ('key' -> 'value'). Протокол — текстовий (можна зробити повністю сумісним із memcached).
Платформа - POSIX (FreeBSD/Linux). Використання посторонніх бібліотек дозволяється. Бажано по можливості використовувати Стандартну Бібліотеку С++ (С++11). Є небажаним заміна компонентів, які існують у Стандартній Бібліотеці компонентами з інших бібліотек (напр. std::thread на boost::thread, std::vectorstd::unique_ptr на boost::ptr_vector). Додаткові бали за абстрагування прошарку збереження даних (для можливості легкої зміни сховища даних – файл, БД, ітд.), за абстрагування моделі обробки з'єднань (напр: fork / pre-fork / threaded / event-based) від роботи з текстовим протоколом.
- gtest - для юнит-тестирования
- asio - для сокетов
Cache - содержит логику кеширования и очистки кеша по time-to-leave MemoryStorage / MmapStorage - хранение данных в памяти или память+файл ThreadedServer / AsyncServer - логика обработки соединений Protocol - логика текстового протокола
Нужно использовать gcc 4.9, 4.8 не поддерживает std::regex, тесты не проходят. Если нету 4.9 запускать memcached_analog_gcc49_64
git submodule update --init
cd memcached_analog
make
./memcached_analog 1234
./memcached_analog test
telnet localhost 1234
- use socket.read_until
- удалять записи из invalidator-контейнера