memcached на файлах
От: webtech  
Дата: 30.11.09 00:44
Оценка:
Приветствую !

Обращаюсь с просьбой помочь. Я устраиваюсь на новую работу. А там тестовое задание.

Сразу разделяю Ваше негодование. Тестовое — значит сам должен сделать. Но я ни в коем случае не прошу его за меня решать или что-либо подобное.

Просто не могу просечь "фишку" задания. То есть что же хочет проверить работодатель. Может хотят увидеть развитую систему классов ? А может грамотную алгоритмизацию ? А может еще что ? Надеюсь кто-то из более опытных людей сможет что-либо подсказать.

Вот, собственно, и само задание:

Напишитe клаcc (клaccы) нa php, рeaлизующий мeхaнизм хрaнeния дaнных в cтилe memcached, пригoдный для иcпoльзoвaния нa выcoкoнaгружeнных прoeктaх. Ключ, для прocтoты, цeлoчислeнный. Кoличecтвo хрaнимых зaписeй, миллиoны штук. Рeaлизуйтe хрaнeниe дaнных в фaйлoвoй систeмe. Рeaлизуйтe хрaнeниe дaнных в sql бaзe. Рeaлизуйтe мeхaнизм oчистки кeшa от уcтaрeвших зaпиceй. Тoчнocть уcтaрeвaния 1 чаc.


Самая большая сложноcть: как это сделать в файловой системе. memcached — это по сути дела большая распределенная хэш-табличка. Где есть 2 основных метода: get(key) и set(key, value). В случае файлов, у меня всё утыкается в изменение/удаление данных. Допустим мы создали три записи:

set('key1', '1000');
set('key2', '1000');
set('key3', '1000');

Это все хранится в файле. Допустим теперь нам надо изменить значение для ключа 'key2' и новое значение будет длиннее старого. Например сделать:

set('key2', '99999999');

Т.к. мы работаем с файлами, то мы не можем просто "раздвинуть" границы для хранения нового значения. Или я ошибаюсь ?

По сути дела тут единственный выход — взять из файла всё, что находится до 'key2', скопировать в tmp-файл, дописать в него новое значение 'key2', затем дописать остаток из исходного файла и заменить исходный файл. Ну и стереть tmp-файл.

Только с учетом объемов ("миллионы штук"), у нас могут появиться довольно-таки здоровенные файлы в несколько сотен метров, с которыми будут проблемы. Не думаю, что разумно двигать сотни мегабайт, ради того, чтобы вставить лишние сто килобайт в середину файла. Это не хорошо с точки зрения производительности. Или я ошибаюсь ?

Кроме того, если у нас под кеш выделен допустим 1 гиг. Мы его забили на 1000 метров. Теперь нам надо в эти 1000 метров запихать 100КБ куда-нибудь в середину. Как мы создадим tmp-файл на 1000 метров ? 1000+1000 = 2000, а это уже явно больше выделенного 1 гигабайта.

С удалением та же беда. Нельзя же просто выкинуть кусок из файла. Опять таки придется пересохранять.

Вариант "создавать по 1 файлу на каждое значение кеша" — тоже не вариант. Несколько миллионов файлов ради кеша — явно не дело.

Если считать, что я тут нигде не ошибся и все верно. Тогда по заданию вообще придется писать что-то вроде своего file-based DB-engine (типа sqlite). С грамотным разделением записей по файлам и всевозможными оптимизациями. Но это ж как-то слишком мастабно. Может я слишком сильно заморачиваюсь ?

Спасибо за то, что дочитали до конца и за любую помощь.
file-based memcahed кэш на файлах
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.