Идея написания сервера кеша приходила ко мне давно, но небыло подходящего повода и инструмента, чтобы начать над ним работу. Сделать свой сервер кеша мне хотелось по двум причинам: опыт, возможность легко добавлять нужные мне функции (кто видел код memcached, тот меня поймет). Основной проблемой для меня был C++. Несмотря на то, что я нередко с ним сталкиваюсь, он мне не нравится совсем. Я не буду начинать холивар и писать о его недостатках. Он мне не нравится так же как кефир с детства: мы с ним несовместимы. Поэтому для меня было большой новостью существование FreePascal. Когда-то давно у меня был опыт работы на Delphi, поэтому с Pascal я был «на ты». Особенно меня удивило то, что FreePascal оказался кроссплатформенным (чем Delphi совсем не блистал).
Что надо для сервера кеша? В основном хеш-таблица, сетевой доступ к ней и средства удаления устаревших записей.
Для реализации хеш-таблицы я выбрал бинарное дерево (возможно, не лучший способ) с разрешением коллизий на основе цепочек. Сетевой интерфейс был реализован с помощью неблокирующих сокетов.
Для работы с сервером я накидал простенький текстовый протокол из трех команд: GET, PUT, REMOVE.
Запросить данные по ключу:
GET <key-len> <key>\r\n
Варианты ответа:
PUT <key-len> <key> <data-len>\r\n
<data>\r\n
Варианты ответа:
REMOVE <key-len> <key>\r\n
Варианты ответа:
В надежде на увлекательную совместную разработку я выложил свои разработки на github'е. Я очень надеюсь, что найду талантливых программистов среди пользователей хабра. Адрес проекта на github: github.com/mdevils/encached
Буду благодарен если подскажете хороший способ организации потоко-безопасной хеш-таблицы.
Новые команды: APPEND, PREPEND, INC, DEC, CAS (Compare and Swap), STAT, TAG (тегировать запись).
Полная поддержка многопоточной записи/чтения без блокировок.
Контроль занимаемой памяти.
Работа под Windows.
Сейчас демон работает на 2332 порту под Linux (x86, x86_64), Mac OS X (x86, x86_64). Возможно будет работать под BSD, не имею возможности протестировать.
Собирается сервер как обычно — командой make. Запускается с аргументом "-r". На машине должен быть установлен FreePascal версии 2.4.0.
P.S. С Новым Годом!
Что надо для сервера кеша? В основном хеш-таблица, сетевой доступ к ней и средства удаления устаревших записей.
Для реализации хеш-таблицы я выбрал бинарное дерево (возможно, не лучший способ) с разрешением коллизий на основе цепочек. Сетевой интерфейс был реализован с помощью неблокирующих сокетов.
Для работы с сервером я накидал простенький текстовый протокол из трех команд: GET, PUT, REMOVE.
Запросить данные по ключу:
GET <key-len> <key>\r\n
Варианты ответа:
- NODATA\r\n
- DATA <data-len> <data>\r\n
PUT <key-len> <key> <data-len>\r\n
<data>\r\n
Варианты ответа:
- SUCCESS\r\n
- HIT\r\n (если переданные данные соответсвуют данным в кеше)
- FAILURE\r\n
REMOVE <key-len> <key>\r\n
Варианты ответа:
- SUCCESS\r\n
- FAILURE\r\n
В надежде на увлекательную совместную разработку я выложил свои разработки на github'е. Я очень надеюсь, что найду талантливых программистов среди пользователей хабра. Адрес проекта на github: github.com/mdevils/encached
Буду благодарен если подскажете хороший способ организации потоко-безопасной хеш-таблицы.
Планы по разработке сервера
Новые команды: APPEND, PREPEND, INC, DEC, CAS (Compare and Swap), STAT, TAG (тегировать запись).
Полная поддержка многопоточной записи/чтения без блокировок.
Контроль занимаемой памяти.
Работа под Windows.
Сейчас демон работает на 2332 порту под Linux (x86, x86_64), Mac OS X (x86, x86_64). Возможно будет работать под BSD, не имею возможности протестировать.
Собирается сервер как обычно — командой make. Запускается с аргументом "-r". На машине должен быть установлен FreePascal версии 2.4.0.
P.S. С Новым Годом!