-
SET KEY VAL [SECONDS] KEY - ключ. VAL - данные. SECONDS - время в секундах, сколько будет храниться значение. Создает новую запись. Если уже существует запись с таким ключом, то при новой записи, время хранения, которое было записано первый раз, сотрется.
-
GET KEY KEY - ключ. Получает значение по ключу, если ключа не существует, то выведет nil.
-
EXPIRE KEY SECONDS KEY - ключ. SECONDS - время в секундах, сколько будет храниться значение. Устанавливает время хранения для значения по ключу.
-
TTL KEY KEY - ключ. Возвращает оставшееся время хранения значения в секундах по ключу.
-
PING Возвращает
PONG, если сервер работает.
Для добавления команды нужно сначала реализовать её функционал работы с данными в файле cache.py. Затем необходимо написать команду - класс, наследуемый об абстрактного класса Command, вызывающий метод, который был создан в cache.py. Затем необходимо зарегестрировать команду в файле server.py в словаре commands, где ключ - название команды, а значение - класс этой команды.
Есть возможность запустить приложение в Docker'e - для этого необходимо приложение Docker Desktop и makefile. Для начала запустить приложение Docker Desktop и выполнить в терминале команду make docker-up.
Для запуска приложения без докера необходимо установить Python и make. Затем необходимо выполнить команду make run.
Для запуска тестов понадобится библиотека pytest. Для запуска тестов введити в консоль команду make run_tests.
Так как был реализован аналог Redis'a, то данные хранятся в оперативной памяти сервера, но, в качестве альтернативы, можно было рассмотреть хранение данных на диске, гибридное хранение (какая-то часть данных в памяти, какая-то часть на диске). Хранение данных в оперативной памяти обеспечивает максимальную скорость доступа, довольно просто было реализовать и протестировать приложение.
В Redis используется вероятностное удаление (периодически запускается фоновый процесс, который случайным образом выбирает подмножество ключей с TTL, и среди выбранных ключей удаляются просроченные, если процент истёкших ключей в выборке высокий, цикл повторяется чаще). В моем приложении запускается фоновый поток, который раз в час проходится по словарю с ключами, для которых установлен TTL, и удаляет все просроченные записи. Используемый мной вариант проще в реализации и тестировании.
Мною был реализован обычный текстовый протокол, похожий на тот, который использует сам Redis. Данная реализация обеспечивает простоту отладки, легкость реализации клиентов на разных языках программирования. Также можно было бы использовать REST API через HTTP, либо gRPC для высокопроизводительного обмена.