и заранее спасибо за помощь.
Предыстория. Я пишу PHP-скрипт, который должен определить место назначения, которого пытается достичь вызывающий абонент. Префиксы телефонии — это строки, идентифицирующие адресата. Для каждого вызова программа должна найти самый длинный префикс, соответствующий строке. Например, число 30561234567 будет соответствовать 305, но не 3057 или 304. Если бы существовало число 3056, это было бы предпочтительным совпадением.
После исследования нескольких структур данных дерево, в котором каждый узел хранит цифру и содержит указатели на другие 10 возможных вариантов, кажется идеальным. Это может быть реализовано как массив массивов, где скрипт может проверить 3, найти там массив, затем проверить 0 в этом новом массиве, найти другой массив и так далее, пока не найдет значение вместо массива. Это значение будет идентификатором получателя (выводом скрипта).
Требования. Производительность абсолютно важна. Время, потраченное на проверку этих префиксов, задерживает вызов, а каждому серверу приходится обрабатывать большое количество вызовов, поэтому структура данных должна храниться в памяти. На данный момент существует около 6000 префиксов.
Проблема. Сценарий запускается каждый раз, когда сервер получает вызов, поэтому данные должны храниться в каком-то кэш-сервере. После проверки memcached и APC (Advanced PHP Cache) я решил использовать APC, потому что он [намного быстрее][3] (это локальное хранилище памяти)
Проблема, с которой я сталкиваюсь, заключается в том, что массив массивов может достигать глубины 10 массивов и будет очень сложной структурой данных, которую, если я добавлю в кеш как объект, потребуется много времени для десериализации.
Однако, если я добавлю каждый отдельный массив в кеш отдельно (с некоторой логической структурой именования, чтобы можно было легко найти его, например, 3 для массива 3, затем 30 для массива 30, 305 для массива, который следует за этим патчем и т. д.), я придется много раз извлекать разные массивы из кеша (до 10 за вызов), что заставляет меня слишком часто обращаться к кешу.
Правильно ли я поступаю? Может есть другое решение? Или один из предложенных мною методов лучше другого?
Спасибо за ваш вклад,
Алекс