Реализация простого мемкэша (без вытеснения ключей по превышению памяти) + веб клиент через который можно делать к нему запросы.
Написано на PHP 5.6 без использования ООП + pcntl + posix.
Протестировано на Ubuntu 14.04.2 LTS + Apache/2.4.7.
Для реализации key-value хранилища была реализована хэш-таблица с открытой адресацией. По умолчанию в качестве функции хэширования используется crc32 (при желании можно заменить на что угодно, например на MurmurHash).
В данной задаче я использую PHP массивы как C'style массивы и игнорирую их реальное внутреннее устройство (в принципе, можно было бы использовать альтернативные реализации массивов, экономящие память и работающие быстрее).
Саму хэш таблицу можно улучшить как минимум следующими шагами:
- Реализовать другую политику расширения (например: чистить только удаленные, а не увеличивать размер таблицы при каждом вызове _dict_extend()).
- Хранить посчитаный хэш от ключа в самой таблице, чтобы не вычислять его заново при перестроении.
- Реализовать уменьшение размерности хэш таблицы если пустых ячеек стало слишком много после очистки.
Время жизни ключа заканчивается только при запросе GET к нему либо при перестроении таблицы. В принципе можно реализовать подобное и на SET запрос, но тогда он будет выполняться медленнее.
Демон поддерживает следующие параметры командной строки:
- -p Путь к pid файлу
- -P Порт на котором будет работать демон (по умолчанию 12345)
- -h Имя хоста (по умолчанию 127.0.0.1)
- -l Папка для записи логов
Поддерживается ограниченный набор команд:
- get [key_name]
- set [key_name] [TTL]\r\n[store data]
- delete [key_name]
- flush_all
- stats
Для команды set, TTL указывается в секундах от 0 до 30 суток. 0 - означает хранить вечно.
Команда stats возвращает текущее состояние демона. Например:
stats
STAT uptime 961 # Время работы демона в секундах с момента запуска
STAT version 0.0.0.1 # Версия демона
STAT hashtable_size 1024 # Текущий размер хэш-таблицы
STAT hashtable_free 1020 # Кол-во не занятых элементов в таблице
STAT hashtable_deleted 1 # Кол-во известных ключей, помеченных как удаленные
END
В веб интерфейсе, для удобства, имя команды не надо вводить, а можно выбрать из выпадающего списка.