Pull to refresh

encached: кеширующий сервер

Reading time2 min
Views2.2K
Идея написания сервера кеша приходила ко мне давно, но небыло подходящего повода и инструмента, чтобы начать над ним работу. Сделать свой сервер кеша мне хотелось по двум причинам: опыт, возможность легко добавлять нужные мне функции (кто видел код memcached, тот меня поймет). Основной проблемой для меня был C++. Несмотря на то, что я нередко с ним сталкиваюсь, он мне не нравится совсем. Я не буду начинать холивар и писать о его недостатках. Он мне не нравится так же как кефир с детства: мы с ним несовместимы. Поэтому для меня было большой новостью существование FreePascal. Когда-то давно у меня был опыт работы на Delphi, поэтому с Pascal я был «на ты». Особенно меня удивило то, что FreePascal оказался кроссплатформенным (чем Delphi совсем не блистал).

Что надо для сервера кеша? В основном хеш-таблица, сетевой доступ к ней и средства удаления устаревших записей.

Для реализации хеш-таблицы я выбрал бинарное дерево (возможно, не лучший способ) с разрешением коллизий на основе цепочек. Сетевой интерфейс был реализован с помощью неблокирующих сокетов.

Для работы с сервером я накидал простенький текстовый протокол из трех команд: 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. С Новым Годом!
Tags:
Hubs:
Total votes 77: ↑46 and ↓31+15
Comments95

Articles